例如,我有以下Python代码:
>>> x = 9.89
现在我知道类型将在运行时动态确定为float,但我不确定如何分配内存。在确定类型后,是否会动态分配浮点大小的内存?分配的内存量总是一样吗?
答案 0 :(得分:4)
这都是CPython的实现细节。其他实现可能表现不同。
变量的内存分配 完全独立于它们所引用的对象类型。无论您指定x = []
,x = 5
还是x = SomeCrazyHugeThing()
,该值都不会影响为x
分配的内存。输入函数调用时,局部变量在Python堆栈框架PyObject *
中被分配为f_localsplus
;其他变量是"已分配"在第一次分配时作为相应命名空间的dict中的dict
个条目。 (疯狂的元类和exec
恶作剧可以用奇怪的方式改变这种情况,但我们不会进入那种情况。)
变量的那个。与示例代码中float
表达式求值的9.89
实例一样,对象的分配方式也不同。每种类型负责在创建类型的实例时分配内存,并在对象增长,收缩或销毁时根据需要重新分配或取消分配内存。完成此操作的方式取决于类型。
请注意,创建对象的时间可能会令人惊讶。例如,在x = 9.89
中,Python在编译该语句的字节码时为float
对象创建(并为其分配内存)。在字节码执行期间,Python只检索现有的float
;没有分配新的float
。
答案 1 :(得分:2)
Python做了很多分配和解除分配。所有物品, 包括整数和浮点数等“简单”类型存储在 堆。为每个变量调用malloc和free会非常慢。 因此,Python解释器使用各种优化的内存 分配方案。最重要的是malloc实现 名为
pymalloc
,专门用于处理大量的 小额拨款。任何小于256字节的对象都使用它 分配器,而任何更大的使用系统的malloc
。
Why doesn't Python release the memory when I delete a large object?
内存分配在Python中的多个级别都有效。有 系统自己的分配器,这是检查时显示的内容 使用Windows任务管理器或 ps 进行内存使用。那就是C 运行时的内存分配器( malloc ),它从系统获取内存 分配器,并以较小的块交给应用程序。 最后,有Python自己的对象分配器,用于 最多256个字节的对象。这个分配器抓住了大块内存 来自C分配器,并使用一个小块将它们切成小块 算法仔细调整了Python。
,特别是花车:
花车也使用不朽的&无限的免费清单。
所以不,它只会在蟒蛇免费列表中没有更多免费float
点时分配,这取决于程序中以前的float
用法。
最终,python正在为你做内存管理,所以即使是对你的问题的坚实回答也不会给你太多的洞察力。
找到其他讨论