Python函数因存在大列表而变慢

标签 python performance memory allocation

我正在测试几种不同方法对我的一些数据进行复杂迭代的速度,我发现了一些奇怪的东西。似乎在某个函数本地有一个大列表会大大减慢该函数,即使它没有触及该列表。例如,通过相同生成器函数的 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/

相关文章:

swift - C 中的 offsetof(struct, member) 在 Swift 中的等价物是什么?

C++将内存转换为数据结构

python - 属性错误 : 'Nonetype' object has no attribute '_info'

python - 如何用 Python 中的空格替换文本中的特殊字符?

Python 拆分一定长度的字符串

c# - 这真的是您使用 Linq-To-Sql 的方式吗?

html - 当有很多输入时,Chrome 很慢

performance - Await在测试用例中是否有开销

python - 覆盖析构函数而不调用他们的 parent

memory - 如何设置 Apache Spark Executor 内存