3

これは、前の質問のフォローアップの質問です。

このコードを考えてみましょう。これは、前の質問のコードよりもおもちゃっぽくありません(ただし、実際のコードよりははるかに単純です)。

import sys
data=[]

for line in open(sys.argv[1]):
    data.append(line[-1])

print data[-1]

今、私はより長い実行時間を期待していました (私のベンチマーク ファイルの長さは 65150224 行です)。これは事実ではなく、以前と同じハードウェアで ~ 2 分で実行されます!

data.append() は非常に軽量ですか? 私はそうは思わないので、テストするためにこの偽のコードを書きました:

data=[]
counter=0
string="a\n"

for counter in xrange(65150224):
    data.append(string[-1])

print data[-1]

これは 1.5 ~ 3 分で実行されます (実行ごとに大きなばらつきがあります)。

以前のプログラムで 3.5 ~ 5 分も取れないのはなぜですか? 明らかに data.append() は IO と並行して発生しています。

これは良い知らせです!

しかし、それはどのように機能しますか?それは文書化された機能ですか?コードを可能な限り機能させるために従わなければならない要件はありますか (負荷分散 IO およびメモリ/CPU アクティビティ以外に)? それとも、単純なバッファリング/キャッシュが動作しているだけですか?

繰り返しますが、Linux 固有の回答のみに関心があるため、この質問に「Linux」というタグを付けました。やる価値があると思われる場合は、OSに依存しない、または他のOSの回答を自由に提供してください。

4

5 に答える 5

1

2番目の例で実行時間がその量だけ変動している場合、タイミングまたは外部の影響(他のプロセス/システム負荷)の方法が、信頼できる情報を提供しないポイントまで時間を歪めていると思われます.

于 2009-05-14T04:11:56.533 に答える
1

ファイル内の行の大きさは? それらがそれほど長くない場合 (約 1K 未満のものが適している可能性があります)、入力バッファリングによりパフォーマンスが向上している可能性があります。

于 2009-05-13T23:37:27.210 に答える
1

list.append() の操作が遅くなるのはなぜだと思いますか? オブジェクトへの参照を保持するためにリストによって使用される内部ポインター配列がますます大きなブロックに割り当てられることを考慮すると、非常に高速です。ポインターとインクリフを設定します。

于 2009-05-13T23:52:30.353 に答える