python怎么用Python高级技巧:用一行代码减少一半内存占用

2019-02-03 06:27

python怎么用Python高级技巧:用一行代码减少一半内存占用



  我想与大家分享一些我和我的团队在一个项目中经历的一些问题。在这个项目中,我们必须要存储和处理一个相当大的动态列表。测试人员在测试过程中,抱怨内存不足。下面介绍一个简单的方法,通过添加一行代码来解决这个问题。

python怎么用Python高级技巧:用一行代码减少一半内存占用

  首先,我们考虑一个简单的learning例子,创建一个Dataltem 类,该类是一个人的个人信息,例如姓名,年龄,地址等。

  我们得到的答案是56bytes,这似乎占用了很少的内存,相当满意喽。那么,我们在尝试另一个包含更多数据的对象例子:

  答案仍然是56bytes,此刻,似乎我们意识到哪里有些不对?并不是所有的事情都第一眼所见那样。

  例如,sys.getsizeof()返回33bytes,是的一个多达33个字节的空行!并且sys.getsizeof(1)返回24bytes,一个整个数字占用24个bytes(我想咨询C语言程序员,远离屏幕,不想在进一步阅读,以免对美观失去信心)。对于更复杂的元素,如字典,sys.getsizeof(.())返回272字节,这是针对空字典的,我不会再继续了,我希望原理是明确的,并且RAM的制造商需要出售他们的芯片。

  这个函数将显示隐藏的“幕后”使所有Python函数(类型、继承和其他内容)都能够正常工作的内容。

python怎么用Python高级技巧:用一行代码减少一半内存占用

  下边有一个函数可以通过递归的方式,调用getsizeof函数,计算对象实际数据量。

  我们获得的答案分别为460bytes和484bytes,这结果似乎是真实的。

  使用这个函数,你可以进行一系列的实验。例如,我想知道如果DataItem结构放在列表中,数据将占用多少空间。get_size ([d1])函数返回532bytes,显然,这与上面说的460+的开销相同。但是get_size ([d1, d2])返回863bytes,小于以上的460 + 484。get_size ([d1, d2, d1])的结果更有趣——我们得到了871字节,只是稍微多一点,也就是说Python足够聪明,不会再次为同一个对象分配内存。

  是的,可以的。Python是一个解释器,我们可以在任何时候扩展我们的类,例如,添加一个新的字段:

  非常好,但是如果我们不需要这个功能呢?我们能强制解释器来指定类的列表对象使用__slots__命令:

  我们确认:是的,确实很重要,get_size (d1)返回…64字节,而不是460字节,即少7倍。另外,创建对象的速度要快20%(请参阅本文的第一个屏幕截图)。

  唉,真正使用如此大的内存增益并不是因为其他开销。通过简单地添加元素,创建一个100,000的数组,并查看内存消耗:

  现在的缺点。激活__slots__禁止所有元素的创建,包括__dict__,这意味着,例如,一下代码将结构转换成json将不运行:

  今天的最后一个测试。有趣的是整个程序需要多少内存。添加一个无限循环的程序,以便它不结束,看看Windows任务管理器中的内存消耗。

python怎么用Python高级技巧:用一行代码减少一半内存占用

  6.9Mb 变成 27Mb … 好家伙, 毕竟, 我们节省了内存, 27Mb 代替 70 ,对于增加一行代码来说并不是一个坏的例子

  注意:TraceMelc调试库使用了许多附加内存。显然,她为每个创建的对象添加了额外的元素。如果关闭它,总的内存消耗将少得多,截屏显示两个选项:

python怎么用Python高级技巧:用一行代码减少一半内存占用

  这可以使用numpy库,它允许您以C样式创建结构,但是在我的例子中,它需要对代码进行更深入的细化,并且第一种方法就足够了。

  奇怪的是在Habré从来没有详细分析使用__slots__,我希望本文将填补这一空缺。

  这篇文章似乎是一个anti-Python广告,但并不是。Python非常可靠(为了“降低”Python程序,您必须非常努力),它是一种易于阅读和方便编写代码的语言。这些优点在很多情况下都大于缺点,但是如果您需要最大的性能和效率,您可以使用像numpy这样的库,它是用C++编写的,它可以很快和高效地与数据一起工作。

  机器学习 2019:AI 发展趋势分析迁移学习:如何将预训练CNN当成特征提取器马克!程序员必须收藏的 10 类工具&库,助你提高效率变大神如何使用 OpenCV 编写基于 Node.js 命令行界面和神经网络模型的图像分类预训练模型及其应用用Pytorch构建一个自动解码器(Python)3D人脸处理工具face3d使用迁移学习/数据增强方法来实现Kaggle分类&识别名人脸部返回搜狐,查看更多