Python中变量的内存分配方式是怎样的?

4

举个例子,我有以下Python代码:

>>> x = 9.89

现在我知道类型将在运行时动态确定为浮点型,但我不确定内存是如何分配的。在确定类型后,是否会动态分配大小为float的内存?分配的内存量是否总是相同的?

2个回答

7

这里涉及到的都是CPython实现的细节,其他实现可能会有不同的行为。

对于变量,内存分配与其引用的对象类型完全独立。无论你赋值x = []x = 5还是x = SomeCrazyHugeThing(),该值不会影响分配给x的内存。局部变量在进入函数调用时分配为Python栈帧的f_localsplus中的PyObject *; 其他变量在第一次赋值时作为相应命名空间的字典条目“分配”为dict。(疯狂的元类和exec操作可能以奇怪的方式更改此内容,但我们不会深入讨论这些。)

这只是针对变量的情况。对象,例如9.89表达式计算得出的float实例,是以不同方式分配的。每个类型在创建类型的实例时负责分配内存,并在需要时重新分配或释放它,当对象增长、缩小或销毁时。执行此操作的方式取决于类型。

请注意,对象创建的时间可能会令人惊讶。例如,在x = 9.89中,Python在编译该语句的字节码时创建(并分配内存给)一个float对象。在字节码执行期间,Python只需检索现有的float;不会分配新的float


4
如果有人给这个帖子点了踩,留下一些他们认为它错在哪里的指示,那就太好了。 - user2357112

3

Python内存管理

Python进行了许多分配和释放。所有对象,包括像整数和浮点数这样的“简单”类型,都存储在堆上。为每个变量调用malloc和free将非常缓慢。因此,Python解释器使用各种优化的内存分配方案。最重要的是一种名为pymalloc的malloc实现,专门设计用于处理大量小型分配。任何小于256字节的对象都使用此分配器,而任何大于256字节的对象则使用系统的malloc

为什么删除大对象时Python不会释放内存?

Python中的内存分配在几个级别上工作。有系统自己的分配器,这是在Windows任务管理器或 ps 中检查内存使用情况时显示的内容。然后有C运行时的内存分配器(malloc),它从系统分配器获取内存,并将其分发给应用程序中的较小块。最后,有Python自己的对象分配器,用于处理小于256字节的对象。此分配器从C分配器获取大块内存,并使用专门为Python调整的算法将其切成较小的块。

对于浮点数:

浮点数还使用一个不朽且无限的自由列表。

因此,如果在Python的自由列表中没有更多可用的float位置,则不会分配它,这取决于程序中先前float的使用情况。

最终,Python为您执行内存管理,因此即使对您的问题有一个很好的答案,也不会给您带来太多的洞察力。

更多讨论请参见Python:垃圾回收失败?


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