我的测试追加会创建一个包含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次执行运行测试是可以的,但是比这更高,我得到了这个错误。
答案 0 :(得分:1)
是的,使用t.timeit
,setup语句只执行一次,然后执行多次test语句。这意味着列表L
会在每次迭代中持续存在并增长,这显然会导致系统内存不足。
每次评估测试语句之前,请尝试min(t.repeat(repeat=100, number=1))
执行设置。
Here's the docs如果您需要更多信息。
答案 1 :(得分:0)
在快速实验中,我非常确定setup
与您的预期完全相反 - 它在每次调用之前运行。因此,每次通过额外的60 mb,不会被收集。当我将该设置代码直接移动到测试代码中时,我能够运行。