你使用的Python对象占用了多少内存?(下)
2019-09-10
现在,100X的内存有可能被毫无用处地困在你的程序里,永远不会被再次利用,而且也拒绝被系统分配给其他程序。更具讽刺意味的是,如果你使用处理模块来运行程序的多个实例,那么就会严重限制你在给定计算机上可以运行的实例数。
内存剖析
想要衡量和测量程序的实际内存使用情况,可以使用memory_profiler模块。我尝试了一下,不确定所得出的结果是否可信。它使用起来非常简单。你装饰一个函数(可能是@profiler装饰器的主函数0函数),当程序退出时,内存分析器会打印出一份标准输出的简洁报告,显示每行的总内存和内存变化。
memory_profiler
https://pypi.python.org/pypi/memory_profiler
```python from memory_profiler import profile
@profile def main(): a = [] b = [] c = [] for i in range(100000): a.append(5) for i in range(100000): b.append(300) for i in range(100000): c.append('1234567890123
45678901234567890') del a del b del c
print ‘Done!’ if __name__ == '__main__':
main() ```
Here is the output:
Line # Mem usage Increment Line Contents
================================================
3 22.9 MiB 0.0 MiB @profile
4 def main():
如你所见,这里的内存开销是22.9MB。在【-5,256】范围内外添加整数和添加字符串时内存不增加的原因是在所有情况下都使用单个对象。目前尚不清楚为什么第8行的第一个range(1000)循环增加了4.2MB,而第10行的第二个循环只增加了0.4MB,第12行的第三个循环增加了0.8MB。最后,当删除a、b和c列表时,为a和c释放了0.6MB,但是为b添加了0.2MB。对于这些结果我并不是特别理解。
总结
Python为它的对象使用了大量内存,也使用了各种技巧和优化方式来进行内存管理。通过跟踪对象的内存使用情况并了解内存管理模型,可以显著减少程序的内存占用。
学习Python,无论你是刚入门的新手还是经验丰富的编码人员,都可以使用我們的完整Python教程指南来学习。