Python 2.7中集合和不可变集合所占内存的区别

6

最近我使用Pympler比较了Python中setfrozenset占用的内存量:

>>> from pympler.asizeof import asizeof
>>> x = range(100)
>>> s = set(x)
>>> f0 = frozenset(x)
>>> f1 = frozenset(s)
>>> asizeof(s)
10824
>>> asizeof(f0)
10824
>>> asizeof(f1)
6728
>>> f0==f1
True

为什么从一个可迭代对象创建的 `frozenset` 与从其他可迭代对象创建的 `frozenset` 占用的内存不同?或者这只是 Pympler 如何近似计算 Python 变量占用内存量的怪癖?

Python 3.4.0也观察到了类似的行为。 - lebedov
相关:frozenset 也不会被 PyObject_Malloc 分配,因此大多数内存跟踪器(pymplertracemalloc)无法看到它。 - OrangeDog
1个回答

1

这是由于C语言中frozenset构造函数的逻辑,但这可能值得提交一个CPython的bug报告。


它是否内部引用了s,因此不像f0那样分配额外的内存? - Michael Aquilina
有趣的发现和好问题(+1),但是给未来读者的注意事项,这个问题已经被审查并被拒绝了(似乎两次)。这是有意为之的(在我看来有一个合理的原因)。请阅读问题评论以了解他们的原因。 - Frank V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接