当Python解释器处理.py文件时,它是否与处理单个语句不同?

时间:2016-04-07 11:25:18

标签: python python-2.7

运行:

a = 257
b = 257
print id(a) == id(b)

结果:

same statement enter image description here

相同的陈述但相反的结果。为什么?

1 个答案:

答案 0 :(得分:10)

test.py中的代码被一起解析,这比在解释器中作为单独语句解析的代码更可优化

当你把它放在一个test.py并运行作为一个整体时,字节码编译器有更好的机会分析文字的用法并优化它们。 (因此,您ab指向同一个地方)

与在解释器中运行单独的语句(单独解析)相反(我认为它只通过预分配优化最多256个而不是257个)

在解释器中使用它来查看单独语句的效果:

>>> a, b = 257, 257      # or if you prefer: a = 257; b = 257
>>> print a is b
True

>>> a = 257
>>> b = 257
>>> print a is b
False

在interperter中定义一个函数还可以对其进行更改以分析和优化使用的文字

>>> def test():
...     a = 257
...     b = 257
...     print a is b
... 
>>> test()
True

此优化不仅限于整数,例如有效。对于浮点数(浮点数不受[-5, 256]范围内整数的缓存影响)

>>> def test():
...     pi = 3.14
...     x = 3.14
...     return x is pi
... 
>>> test()
True

# As opposed to separate statements:
>>> pi = 3.14
>>> x = 3.14
>>> x is pi
False

查看字节代码,看它确实重用了相同的常量

>>> dis.dis(test)
  2           0 LOAD_CONST               1 (3.14)
              3 STORE_FAST               0 (pi)

  3           6 LOAD_CONST               1 (3.14) <-- Same constant 1 reused
              9 STORE_FAST               1 (x)

  4          12 LOAD_FAST                1 (x)
             15 LOAD_FAST                0 (pi)
             18 COMPARE_OP               8 (is)
             21 RETURN_VALUE