在 Python shell 和 *.py 文件中运行时 Python 不同的内存管理行为

标签 python python-2.7

示例 1:

➜  /tmp  cat t.py 
a = 250000000000
b = 250000000000
print id(a), id(b), id(a) == id(b)
➜  /tmp  python t.py 
140450848587992 140450848587992 True  #(Why is True?)

示例 2:

➜  /tmp  python
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 250000000000
>>> b = 250000000000
>>> print id(a), id(b), id(a) == id(b)
140443481339400 140443481339208 False #(I think it should be False)

我知道 Python 有一个小整数缓存池(从 -5 到 256),所以两个大整数应该一直有不同的 id。

如何解释大整数在 Python shell 和 *.py 文件中运行时的不同行为?

最佳答案

如果我是读取 .py 文件的 Python 解释器(如您的第一个示例),我只会为这个数字分配一次内存,然后生成 ab指向这个位置。

例如,解释器读取此文件并看到两个变量被分配了相同的值并认为:“我想通过为相同的值分配两个部分来浪费内存吗?不,我不想。相反,我最好分配一个单独的 block 并将该值存储在其中”。因此,此值只有 一个 副本,这就是这些变量具有相同 ID 的原因。

在第二种情况下,Python 必须在您进行赋值时分配内存,因此有两 block 内存具有相同的数据。

综上所述,在第一种情况下,解释器对代码了解得更多(给出了整个代码),因此它可以优化它(并生成.pyo 文件),而在第二个文件中,它根本无法进行任何优化。

关于在 Python shell 和 *.py 文件中运行时 Python 不同的内存管理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36620764/

相关文章:

python - 如何在 python 中执行逻辑套索?

python - 在 numpy 中,将两个结构化矩阵简洁地相乘

Python:以时间为优先级的优先级队列

python - 深层嵌套字典/ map 情况所需的替代数据结构

python - 如何增加 csv 文件的默认列宽,以便在打开文件时所有文本都能正确显示?

python - 根据 timedelta 列中的总秒数过滤 DataFrame

python - 在python中以编程方式查找列表中的最大元素

python - HDF5 可能的数据损坏或丢失?

python-2.7 - python : reading from rfile in SimpleHTTPRequestHandler

Python 扩展 : symbol(s) not found for architecture x86_64 error