【发布时间】:2011-08-14 23:21:19
【问题描述】:
我正在测试几种不同方法对我的一些数据进行复杂迭代的速度,我发现了一些奇怪的东西。似乎在某个函数本地有一个大列表会大大减慢该函数,即使它没有触及该列表。例如,通过相同生成器函数的 2 个实例创建 2 个独立列表,第二次的速度大约慢 2.5 倍。如果在创建第二个列表之前删除了第一个列表,则两个迭代器的速度相同。
def f():
l1, l2 = [], []
for c1, c2 in generatorFxn():
l1.append((c1, c2))
# destroying l1 here fixes the problem
for c3, c4 in generatorFxn():
l2.append((c3, c4))
每个列表最终都有大约 310 万个项目,但我也看到了较小列表的相同效果。第一个for 循环运行大约需要 4.5 秒,第二个需要 10.5 秒。如果我在注释位置插入l1= [] 或l1= len(l1),两个for 循环都需要4.5 秒。
为什么函数中本地内存分配的速度与该函数变量的当前大小有关?
编辑: 禁用垃圾收集器可以解决所有问题,因此必须是由于它不断运行。结案!
【问题讨论】:
标签: python performance memory allocation