2

私のテスト追加は、60MB の文字列と 5 バイトの文字列を含むリストを作成します。このリストは次に結合されjoin()ます:

import timeit
setup_str = 'str_5byte = "\xfa\xea\x02\x02\x02"; L = [str_5byte]; str_60mb = str_5byte * 12000000'
t = timeit.Timer('L.append(str_60mb); str_long = "".join(L)', setup=setup_str)
t.timeit(100)

この例外を返します:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python25\lib\timeit.py", line 161, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
MemoryError

実行のたびに変数が削除され、ガベージ コレクションが行われると想定しているのに、なぜメモリ不足になるのでしょうか? 8 回の実行でテストを実行しても問題ありませんが、それを超えるとこのエラーが発生します。

4

2 に答える 2

1

はい、t.timeitsetup ステートメントは 1 回だけ実行され、次に test ステートメントが複数回実行されます。これは、リストLが持続し、反復ごとに成長することを意味し、その結果、明らかにシステムのメモリが不足します。

min(t.repeat(repeat=100, number=1))テストステートメントの評価の前に毎回セットアップを実行してみてください。

さらに情報が必要な場合は、こちらのドキュメントをご覧ください。

于 2014-04-04T17:48:18.710 に答える
0

setup簡単な実験では、期待とは正反対のことを行うと確信しています。すべての呼び出しの前に実行されます。したがって、毎回余分に 60 mb を取得しますが、これは収集されません。そのセットアップ コードをテスト コードに直接移動すると、実行できるようになります。

于 2014-04-04T11:49:38.450 に答える