如何在Python中管理变量和内存?它是否有堆栈和堆以及用于管理内存的算法?鉴于这方面的知识,有关于大数据/数据处理的内存管理的建议吗?
答案 0 :(得分:91)
如何在Python中管理变量和内存。
自动地!不,实际上,您只需创建一个对象,Python虚拟机就可以处理所需的内存以及将其放置在内存布局中的位置。
它是否有堆栈和堆以及用于管理的算法 存储器?
当我们谈论CPython
时,它使用私有堆来存储对象。 From the CPython C API documentation:
Python中的内存管理涉及包含所有内容的私有堆 Python对象和数据结构。这个私人的管理 Python内存管理器在内部确保堆。 Python 内存管理器有不同的组件处理各种 动态存储管理方面,如共享,细分, 预分配或缓存。
内存回收主要由引用计数处理。也就是说,Python VM保留一个内部日志,指出有多少引用引用了一个对象,并且当没有更多引用引用它时自动垃圾收集它。此外,通过检测试图查找所有可到达对象的对象a mechanism to break circular references的无法到达的“孤岛”,有somewhat in reverse of traditional GC algorithms(引用计数无法处理)。
注意: 请注意,此信息具体为 CPython
。其他python实现,例如pypy
,iron python
,jython
和其他python实现可能在实现细节方面彼此不同,也可能与CPython不同。为了更好地理解,可能有助于理解Python语义(语言)和底层实现之间存在差异
鉴于这方面的知识有关于大数据/数据处理的内存管理的建议吗?
现在我不能谈论这个,但我确信NumPy(最流行的数字运算python库)具有优雅处理内存消耗的机制。
如果您想了解有关Python的Internals的更多信息,请查看以下资源:
答案 1 :(得分:42)
Python没有 任何 这样的东西。
Python是语言,并未指定实现必须如何实现Python语言定义的语义。
每个实现(CPython,PyPy,IronPython, Stackless ,Jython ......)都可以自由地做到这一点!
在 C Python中,所有对象都存在于堆上:
Python中的内存管理涉及包含所有Python对象和数据结构的私有堆。 1
CPython虚拟机基于堆栈:
>>> def g():
x = 1
y = 2
return f(x, y)
>>> import dis
>>> dis.dis(g)
2 0 LOAD_CONST 1 (1) # Push 1 onto the stack
3 STORE_FAST 0 (x) # Stores top of stack into local var x
3 6 LOAD_CONST 2 (2) # Push 2 onto stack
9 STORE_FAST 1 (y) # Store TOS into local var y
4 12 LOAD_GLOBAL 0 (f) # Push f onto stack
15 LOAD_FAST 0 (x) # Push x onto stack
18 LOAD_FAST 1 (y) # Push y onto stack
21 CALL_FUNCTION 2 # Execute function with 2
# f's return value is pushed on stack
24 RETURN_VALUE # Return TOS to caller (result of f)
请记住,这是CPython特有的。但是,堆栈不包含实际值,它会保留对这些对象的引用。
1 :Source