6

Python でファイルのようなものを繰り返し処理することは、そのメソッドをループで呼び出すことと同じだといつも思っていreadlineましたが、今日、そうではない状況を見つけました。具体的には、私はPopen'd プロセスを持ってpいます

list(itertools.takewhile(lambda x: x != "\n",
                         p.stdout))

ハングします (おそらくp、入力を待機するためです。 と の両方stdinstdoutPython プロセスへのパイプです)。

list(itertools.takewhile(lambda x: x != "\n",
                         iter(p.stdout.readline, "")))

誰かが違いを説明できますか?

4

1 に答える 1

5

違いは、純粋に反復の実装とreadlineメソッドの実装にあります。ファイルの反復は、ブロック(デフォルトでは8キロバイト)を読み取り、消費するときにバッファーを行に分割します。一方、このreadline方法では、複数行を読み取らないように注意します。つまり、文字ごとに読み取ることになります。ブロックでの読み取りははるかに効率的ですが、読み取りの間にファイルに対する他の操作を混在させることはできません。ファイルを反復処理する場合、すべての行を順番に読み取ることが目的であり、他の操作は実行されないことが期待されます。メソッドはそのreadline仮定をすることができません。

Sven Marnachがあなたの質問に対するコメントでほのめかしたように、パフォーマンスを犠牲にして、ブロックを読み込まiter(f.readline, '')にファイルから行を読み取るイテレーターを取得するために使用できます。

于 2012-04-04T14:02:36.960 に答える