首页 > 解决方案 > 为什么函数定义行有很大的内存增量?

问题描述

我遇到了内存限制,并使用了神奇的 memory_profiler 来查看增量最大的函数。

我可以看到几乎所有的内存增量都发生在函数定义行中:

Line #    Mem usage    Increment   Line Contents

60        6141.9 MiB   4376.1 MiB  def quantiles(ticks, lb, quantile_entry, quantile_exit=0,
61                                           quantile_period='1D'):  
62        6141.9 MiB   0.0 MiB         quantile_entry = int(quantile_entry * 10)
...
118       6134.1 MiB   0.0 MiB         return ticks

我猜这是因为该函数正在创建它接收到的参数的副本?

输入数据帧的“滴答声”可能会变得非常大,但即便如此,我也只希望增量最多为先前使用量的 100%。这里它从 ~2GB --> ~6GB 跳跃。有什么建议可以更好地理解这种增加吗?

标签: pythonmemory-profiling

解决方案


仅当您处理不可变参数时,Python 的行为就是按值传递。也就是说,如果您传递一个可变对象(如 a DataFrame),它会通过引用传递:如果正在克隆数据帧,则必须通过任何指令在函数内部显式完成。

我的猜测是,在代码中,你没有在行之间共享的62东西118是扩展ticks变量。我的建议是在计算时也要考虑常量:

如果你有

l = [1] * (1e6)

在一个函数里面你做类似的事情

def my_function(li):
    for i in range(len(li)): # O(n) loop
        li.append([1,2])
    return li

确实,空间复杂度是,O(n)但是我希望常数乘以内存将高于2(或您提到的〜100%);在这种情况下,我期待:

mem(my_function(l)) > 3 * mem(l)

推荐阅读