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.timeit的,setup 语句只执行一次,然后 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 回答