python - 为什么函数定义行有很大的内存增量?
问题描述
我遇到了内存限制,并使用了神奇的 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 跳跃。有什么建议可以更好地理解这种增加吗?
解决方案
仅当您处理不可变参数时,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)
推荐阅读
- amazon-web-services - AutoScaling::LaunchConfiguration 的默认 BlockDeviceMappings 设置
- javascript - 将用户位置保存到 mongodb、nodejs 服务器
- java - 检索 TextView 的名称并在其他类之间共享它们的值
- android - How to switch jetpack camerax preview from back to front vice versa?
- python-3.5 - Half day leaves in payslip
- html - 将复选框居中在一行中
- wordpress - 如何在 Wordpress 中合并 2 个列表菜单
- python-3.x - 如何使用sqlite在python中用户定义的列的变量编号中输入可变数量的值?
- rest - 使用 JWT 保护用于验证客户端的 RESTful API
- webpack - 如何在项目中加载全局模块?