gpt4 book ai didi

Python 程序占用太多内存

转载 作者:太空狗 更新时间:2023-10-30 02:34:28 26 4
gpt4 key购买 nike

我从 Heapy 获得了这些结果,但不清楚它们的确切含义。

 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0 262539 59 36961284 48 36961284 48 dict (no owner)
1 65536 15 34340864 45 71302148 93 dict of myobj.Container
2 65536 15 2097152 3 73399300 96 myobj.Container

myobj 是一个包含大约 20 个 True/False 值和 20 个数字值的类(所有这些都可以存储在 2 个字节中)。

我有一个 256*256 的数组。我真的不明白为什么他们会消耗 35 或 70 MB 的内存。如果可能,我想将其降低到 10 MB 以下。

对象中的大部分数据都组织成字典以便于访问。字典本身不会改变,而且毫无意义。它们会造成很大的开销吗?

用按位运算符将所有数据打包成 1 个数字是否有益?我应该能够以 32 或 64 字节存储对象的全部数据。我希望编译器能像其他语言一样自动执行此类操作,但它似乎在做相反的事情。

除了使用装饰器之外,该类无缘无故地继承了内置类型对象。这会导致很多开销吗?

也很好奇“dict(无所有者)”是什么意思以及它消耗另一半内存的原因。

编辑:sys.getsizeof(myobj.Container) 确实报告了 450 字节!疯了吧。我只使用字典,因为我需要根据索引访问数据。就我而言,编译器应该摆脱结构并直接访问值。有更好的方法吗? (我不认为列表是答案)

最佳答案

Python 不会消除此类结构的开销。对不起。它的动态特性使得这样的编译器优化很困难。但是我不知道有什么语言可以消除因将内容保存在字典中而引入的开销。

dict(无所有者)可能包含您在对象中创建的所有词典。它们被标记为无所有者,因为它们不是对象实例的字典。

你可以做什么:

使用__slots__,如果你添加__slots__ = ('the','names','of','fields')作为类属性,python将使用类的更有效的实现。它将摆脱用于保存属性的字典。

如果您的词典可以改写为使用列表,那么情况会有所改善。列表比字典更节省内存。

为了获得最佳效率,您应该重新设计您的系统以使用 numpy 数组。您类(class)中的每个属性都将成为一个 256*256 大小的数组。在这种情况下,每个元素都将在空间上非常有效地存储。

或者,您可以查看 PyPy。它提供了带有 JIT 的 python 的替代实现以及可能有帮助的各种时间/空间优化。

sys.getsizeof 没有报告您认为它报告的内容。 sys.getsizeof(myobj.Container) 报告类对象的大小,而不是实际容器对象的大小。你想要 sys.getsizeof(myobj.Container()) 或类似的。即使这样也不准确,因为它不包含除基本对象之外的任何内容。它没有考虑保存属性的字典。它只会报告报告中第三行的大小。

关于Python 程序占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com