web-dev-qa-db-ja.com

最速のstdin / out IO in python 3?

私はpython 3.1.2を使用してSPOJ.plのいくつかの問題を解決してきましたが、単純な問題の結果が速い人もいるので、入出力を処理するより速い方法があるかどうか疑問に思います。

使ってみました

input()
print()

そして

sys.stdin.readline()
sys.stdout.write()

というより

for line in sys.stdin:
    #Handle input
    sys.stdout.write(output)

各行を処理します。また、すべての出力をリストに収集し、すべてが処理されたときに一度にすべてを印刷しようとしました。

しかし、これらはすべて同様の実行時間を生み出します。

Stdin/outからの入力と出力を処理するより速い方法はありますか?

15
while

以下はおそらく最速です:

  1. os.read(0, some_big_enough_number)を使用してすべての入力を一度に読み取ります。

  2. 出力を処理し、結果をリストresultsに収集します。

  3. os.write(1, "".join(results))を使用してすべての出力を一度に書き込みます。

os.read()os.write()がPython I/Oを使用するよりも速い場合があることに気付いた1つのケースを覚えていますが、詳細を覚えていません。

10
Sven Marnach

おそらくそうではありません。

最終的に、printsys.stdout.write()を呼び出します。ただし、printは組み込み関数であり、おそらくCで実装されているため、sys.stdout.write()を呼び出すよりも高速な場合があります。

すべてのIOはsys.stdoutが返すオブジェクトを通過する必要があるため、これがボトルネックです。sys.stdinについても同じことが言えます。

これを速くするための手品はありません。

より高速なIOが必要な場合は、次のことを試してください。

  • 代わりにファイルに書き込む
  • バッファリングされたIO(小さなシェルスクリプトでbufferコマンドを使用してstdoutをパイプする)を使用します。
  • メモリマップトファイルを使用する
  • 出力を読み取るプロセスが追いつくことができることを確認してください。たとえば、DOSコンソールはかなり遅いです。遅いコマンドを介して出力をパイプすると、pythonプロセスがブロックされる可能性があります。

[EDIT] SPOJ.plはある種のプログラマーの銃撃戦サイトのようです。この場合、I/O速度は原因ではありません。問題を解決するために不適切なアルゴリズムを使用しました。

良好なパフォーマンスと公正なパフォーマンスの速度差は、簡単に10〜100,000倍になる可能性があります。数行のコードを変更することで、45分前の5秒未満でコードを実行できるようになりました。

2
Aaron Digulla

SPOJでは、さまざまなプログラミング言語から選択できます。実行時間を他のプログラミング言語で書かれた他のソリューションと比較していますか?

楽しみのために、最初の問題(コードネームTEST)に次の解決策を提出して、実行時間を比較しました。

C++ソリューション(G ++ 4.3.2)

#include <iostream>
int main ( int, char** )
{
     for ( int number=0; (std::cin >> number) && (number != 42); ) {
         std::cout << number << std::endl;
     }
}

submission を参照してください。

Python(2.5)ソリューション

import sys
for line in sys.stdin:
    number = int(line)
    if number == 42:
        break
    print number

submission を参照してください。

結論

これがどちらの言語でも絶対的に最高のパフォーマンスを発揮するかどうかは100%確信できませんが、最適化するコードはそれほど多くありません。

C++の0.00測定値とPythonコード)の0.04測定値を取得します。両方のプログラムに送信される数値のシーケンスが同じであると仮定すると、他の言語のソリューションに対するランタイムはほとんど意味がありません(次の段落を参照)。

さて、これは単純な問題にのみ当てはまります。最も高度な問題では、問題に適切なアルゴリズムを選択する必要があり、間違ったアルゴリズムを選択すると劇的な結果が生じます。そのような場合、慎重に作成されたPythonソリューションは慎重に作成されたC++ソリューションよりも遅い可能性がありますが、優れたPythonソリューションは、他の言語で記述されたナイーブなソリューションよりも優れています。

2
André Caron