我正在测试几种不同方法对我的一些数据进行复杂迭代的速度,我发现了一些奇怪的东西。似乎在某个函数本地有一个大列表会大大减慢该函数,即使它没有触及该列表。例如,通过相同生成器函数的 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 秒。
为什么函数中本地内存分配的速度与该函数变量的当前大小有关?
编辑: 禁用垃圾收集器可以解决所有问题,因此必须是由于它不断运行。结案!
最佳答案
当您创建那么多新对象(300 万个元组)时,垃圾收集器就会陷入困境。如果您使用 gc.disable() 关闭垃圾收集,问题就会消失(并且程序在启动时运行速度提高了 4 倍)。
关于Python函数因存在大列表而变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5823465/