Python中的变量和内存是如何管理的?它是否有堆栈和堆,并使用哪种算法来管理内存?鉴于这些知识,对于大量数据处理,有没有关于内存管理的建议?
Python中的变量和内存是如何管理的?它是否有堆栈和堆,并使用哪种算法来管理内存?鉴于这些知识,对于大量数据处理,有没有关于内存管理的建议?
CPython
的。其他Python实现,如pypy
、iron python
、jython
等,在实现细节上可能与彼此和CPython有所不同。为了更好地理解这一点,需要理解Python语义(语言)和底层实现之间的区别
现在我不能详细谈论这个问题,但我确信NumPy(用于数字计算的最流行的Python库)具有优雅处理内存消耗的机制。基于这些知识,是否有关于大量数据/数据处理的内存管理建议?
.pyc
文件,它们是为Cpython VM保存在文件中的字节码,以避免需要重新编译。 - ThisGuyCantEven.pyc
用于CPython,可能是.CLASS
用于Jython,因为.CLASS
文件是JVM的字节码)。即使Pypy最终也会发出字节码以在LLVM上运行(还使用另一种中间表示形式)。 - ThisGuyCantEvenPython没有任何这样的东西。
Python是一种编程语言,它不规定实现必须如何实现由Python语言定义的语义。
每个实现(CPython、PyPy、IronPython、Stackless、Jython...)都可以做自己的事情!
在CPython中,所有对象都存放在堆上:
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: 来源