私は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からの入力と出力を処理するより速い方法はありますか?
以下はおそらく最速です:
os.read(0, some_big_enough_number)
を使用してすべての入力を一度に読み取ります。
出力を処理し、結果をリストresults
に収集します。
os.write(1, "".join(results))
を使用してすべての出力を一度に書き込みます。
os.read()
とos.write()
がPython I/Oを使用するよりも速い場合があることに気付いた1つのケースを覚えていますが、詳細を覚えていません。
おそらくそうではありません。
最終的に、print
はsys.stdout.write()
を呼び出します。ただし、print
は組み込み関数であり、おそらくCで実装されているため、sys.stdout.write()
を呼び出すよりも高速な場合があります。
すべてのIOはsys.stdout
が返すオブジェクトを通過する必要があるため、これがボトルネックです。sys.stdin
についても同じことが言えます。
これを速くするための手品はありません。
より高速なIOが必要な場合は、次のことを試してください。
buffer
コマンドを使用してstdoutをパイプする)を使用します。[EDIT] SPOJ.plはある種のプログラマーの銃撃戦サイトのようです。この場合、I/O速度は原因ではありません。問題を解決するために不適切なアルゴリズムを使用しました。
良好なパフォーマンスと公正なパフォーマンスの速度差は、簡単に10〜100,000倍になる可能性があります。数行のコードを変更することで、45分前の5秒未満でコードを実行できるようになりました。
SPOJでは、さまざまなプログラミング言語から選択できます。実行時間を他のプログラミング言語で書かれた他のソリューションと比較していますか?
楽しみのために、最初の問題(コードネームTEST
)に次の解決策を提出して、実行時間を比較しました。
#include <iostream>
int main ( int, char** )
{
for ( int number=0; (std::cin >> number) && (number != 42); ) {
std::cout << number << std::endl;
}
}
submission を参照してください。
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ソリューションは、他の言語で記述されたナイーブなソリューションよりも優れています。