![]() |
1
5
因此,该副本只需要用100万个引用创建一个新的列表对象,该对象在MyOSX 10.13(64位OS)上在我的Python 3.6构建上占用了超过8MB的内存:
空的
Python列表对象过度分配空间以增长,转换
而副本只剩下大约87K的额外空间:
在Python3.6上,我也不能复制文章中的声明,部分原因是Python已经看到了很多内存管理方面的改进,部分原因是文章在几个方面是错误的。
行为
具体来说,我 可以 使用Python2.7重新生成结果这是我在机器上看到的:
正在发生的是Python的内存管理系统正在分配一个新的内存块来进行额外的扩展。不是新的
这个
Python 3
Python 3 .x内存管理器和列表实现比2.7中的一个更聪明;显然,新的列表对象能够适应现有的可用内存,在创建时预先分配。
我们可以使用
manually built Python 2.7.12 tracemalloc binary
以及
small patch to
我注意到,作者也感到困惑:
(粗体强调我的意思)。
这里的错误是假设Python进程大小中的所有内存更改都可以直接归因于特定对象,但实际情况要复杂得多,因为内存管理器可以添加。
然后移开!
内存“ARNEAS”,根据需要为堆保留的内存块,如果有意义的话,将在更大的块中这样做。这里的过程是复杂的,这取决于
interactions between Python's manager and the OS
令人不安的是,同样的误解导致作者建议反对使用。
我将打开TeaNo团队关于这个帖子的对话,这篇文章是错误的,令人困惑的,Python 2.7很快就会完全过时,所以他们真的应该关注Python 3的内存模型。 (*)
当您创建
新列表
从
(*) 附录 :我打开了 issue #6619 和塔诺计划。这个项目符合我的评估,而且 removed the page from their documentation ,尽管他们还没有更新发布的版本。 |
![]() |
Community wiki · 如何调试Python内存故障? 1 年前 |
![]() |
tuskiomi · 如何为参考提供明确的锈蚀寿命? 2 年前 |
![]() |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
![]() |
mo FEAR · C++ STL映射是否在创建后移动了一个值的位置? 2 年前 |
![]() |
Pooyanoss · 覆盖类的堆栈分配实例 2 年前 |
![]() |
TheKing · 为什么数组的地址可以有负值? 2 年前 |
![]() |
Http2inc · 如何从内存中解析这些二进制数据? 3 年前 |
![]() |
tifrel · 如何检查已编译类型的表示形式? 3 年前 |
![]() |
Gabriele · 释放GSL矩阵的正确方法是什么? 6 年前 |
![]() |
Makogan · 3D纹理大小影响程序输出,不会引发错误 6 年前 |