带有内容的Python深度getsizeof列表?

标签 python memory

我很惊讶 sys.getsizeof( 10000*[x] ) 是 40036,无论 x:0、“a”、1000*“a”、{}。
是否有 deep_getsizeof 哪个正确考虑共享内存的元素?
(这个问题来自于查看内存数据库表,如 range(1000000) -> 省份名称:列表或字典?)
(Mac ppc 上的 Python 是 2.6.4。)

添加: 10000*["Mississippi"] 是 10000 个指向一个 "Mississippi"的指针, 正如一些人指出的那样。试试这个:

nstates = [AlabamatoWyoming() for j in xrange(N)]

where AlabamatoWyoming() -> 一个字符串 "Alabama".. "Wyoming"。 deep_getsizeof(nstates) 是什么?
(我们怎么知道?

  • 适当的 deep_getsizeof:困难,~ gc 示踪剂
  • 根据总 vm 估算
  • python 实现的内幕知识
  • 猜。

1 月 25 日添加: 另见when-does-python-allocate-new-memory-for-identical-strings

最佳答案

10000 * [x] 将生成一个列表,该列表包含 10000 次相同的对象,因此 sizeof 实际上比您想象的更接近正确。但是,深度 sizeof 是非常有问题的,因为无法告诉 Python 何时要停止测量。每个对象都引用一个类型对象。应该计算类型对象吗?如果对 typeobject 的引用是最后一个,那么如果您删除了该对象,那么 typeobject 也会消失吗?如果列表中有多个(不同的)对象引用同一个字符串对象怎么办?应该计算一次还是多次?

简而言之,获取数据结构的大小是非常复杂的,不应该添加 sys.getsizeof() :S

关于带有内容的Python深度getsizeof列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2117255/

相关文章:

python - PySpark - 按列值拆分/过滤 DataFrame

javascript - JSON.parse 需要转义哪些字符

python - 如何在 Gensim 中获取上下文单词列表

python - 在两个列表列表之间执行操作并跟踪初始列表

python - 有多少种方法可以将元素添加到列表中,哪种方法最快?

c - "@far int* @near IntegerPointer;"的含义

c++ - 是否有免费软件实用程序可以监视 C++ 应用程序的内存泄漏?

Java 垃圾收集引用类

c++ - 当函数返回时,函数中分配的内存是否被释放?

java - 当我更改类时实例会发生什么?