如果我说x = x会怎么样? (在较低的编译器级别上)

时间:2016-05-28 23:41:35

标签: python reference compilation

在Python(更具体地说是Python 3.x)中,如果我说x = x会发生什么,其中x是对可变的引用(如list)或对int的引用低级别的不可变(如class A: def __init__(self): self.a = self.init_a() def init_a(self): self.a = some_value """ do stuff with self.a here """ return self.a )?编译器是否只是忽略了这些废话?

更具体地说,如果我们遇到以下情况,编译器会做什么:

self.a

对于那些没有注意到的人,init_a(self)通过函数class A有效地分配给自己。

我知道上面的__init__(self)这个案例看起来很傻,但是我试图通过清楚地初始化boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, v); 函数中的所有成员变量来保持我的代码清晰可读(在我不同的类中)我正在实施真实的)。我只想知道编译器是否优化了这一步,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果(我猜它会被优化掉,但我想成为当然 - 你永远不知道。)

3 个答案:

答案 0 :(得分:5)

from dis import dis

def foo():
    x = 1
    x = x

dis(foo)

结果:

  4           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (x)

  5           6 LOAD_FAST                0 (x)
              9 STORE_FAST               0 (x)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE 

这表明即使在最微不足道的情况下,x = x也没有被优化掉(在CPython中,这是dis的用途)。

答案 1 :(得分:1)

  

我只是想知道编译器是否优化了这一步骤,或者它是否在任何情况下执行某些操作,即使该语句没有产生任何结果。

除非Python语言参考说明了 1 ,否则任何优化或缺少它都是特定于实现的 2 。您可以研究特定的Python实现对此做了什么,但不能概括为所有Python实现。

1 - 我粗略搜索规范的this copy并不是对优化的任何相关讨论。因此,我的解读是允许有效的优化,但不是必需的。 (有效的优化将不会改变规范明确要求的有效Python程序的任何可观察行为。)

2 - 确实规范说明了这一点:"这些实现中的每一个[在规范中上面列出]在某种程度上与本手册中记录的语言有所不同,或者介绍 超出标准Python文档所涵盖的特定信息。请参考实施 - 特定文档,以确定您需要了解的有关您正在使用的具体实现的其他内容。"

答案 2 :(得分:1)

这看起来很奇怪,但实际上不可能实现你建议的优化,因为python太动态了。

请考虑以下代码:

[Definition of your A class]
@property
def sneaky(self):
    return self._a
@sneaky.setter
def sneaky(self, value):
    self._a = value * 2
A.a = sneaky
a = A()

self.a =方法中的__init__突然开始产生效果!它使a的价值翻倍。 Python确实很有活力。