使用带有`timeit`的60MB字符串测试连接列表会导致MemoryError

时间:2014-04-04 09:20:49

标签: python timeit

我的测试追加会创建一个包含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次执行运行测试是可以的,但是比这更高,我得到了这个错误。

2 个答案:

答案 0 :(得分:1)

是的,使用t.timeit,setup语句只执行一次,然后执行多次test语句。这意味着列表L会在每次迭代中持续存在并增长,这显然会导致系统内存不足。

每次评估测试语句之前,请尝试min(t.repeat(repeat=100, number=1))执行设置。

Here's the docs如果您需要更多信息。

答案 1 :(得分:0)

在快速实验中,我非常确定setup与您的预期完全相反 - 它在每次调用之前运行。因此,每次通过额外的60 mb,不会被收集。当我将该设置代码直接移动到测试代码中时,我能够运行。