gpt4 book ai didi

python - CPython 内部结构

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:25 27 4
gpt4 key购买 nike

GAE 有各种限制,其中之一是最大的可分配内存块大小为 1Mb(现在是 10 倍,但这并没有改变问题)。这一限制意味着不能在 list() 中放置超过一定数量的项目,因为 CPython 会尝试为元素指针分配连续的内存块。拥有巨大的 list() 可以被认为是糟糕的编程习惯,但即使程序本身没有创建巨大的结构,CPython 也会在幕后维护一些结构。

看起来 CPython 正在维护单个全局对象列表或其他东西。 IE。具有许多小对象的应用程序倾向于分配越来越大的单个内存块。

第一个想法是 gc,禁用它会稍微改变应用程序行为,但仍会保留一些结构。

遇到此问题的最简单的短应用程序是:

a = b = []
number_of_lists = 8000000
for i in xrange(number_of_lists):
b.append([])
b = b[0]

谁能告诉我如何防止 CPython 在应用程序中有很多对象时分配巨大的内部结构?

最佳答案

在 32 位系统上,您创建的 8000000 个列表中的每一个都会为列表对象本身分配 20 个字节,另外还有 16 个字节用于列表元素的向量。所以你试图分配至少 (20+16) * 8000000 = 20168000000 字节,大约 20 GB。这是最好的情况,如果系统 malloc 只分配与请求一样多的内存。

我计算列表对象的大小如下:

  • PyListObject 结构本身中的 2 个指针(参见 listobject.h)
  • 1 个指针和一个 Py_ssize_t 用于列表对象的 PyObject_HEAD 部分(参见 object.h )
  • Py_ssize_t 用于 PyObject_VAR_HEAD(也在 object.h 中)

列表元素的向量稍微过度分配以避免在每次追加时调整它的大小 - 请参阅 listobject.c 中的 list_resize| .大小为 0、4、8、16、25、35、46、58、72、88 ... 因此,您的单元素列表将为 4 个元素分配空间。

你的数据结构是一个有点病态的例子,付出了可变大小列表对象的代价而不使用它 - 你的所有列表都只有一个元素。您可以通过使用元组而不是列表来避免 12 字节的过度分配,但要进一步减少内存消耗,您将不得不使用使用更少对象的不同数据结构。很难说得更具体,因为我不知道你想要完成什么。

关于python - CPython 内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/572780/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com