<p>两个O(1)操作所需的时间可能非常不同。实例属性查找(<code>self.printMethod</code>)和局部变量都是O(1),但局部变量访问经过优化,不需要字典查找,因此速度更快。查看访问CPython中的局部变量<em>vs</em>实例变量的字节码:</p>
<pre><code>>>> import dis
>>> class MyClass:
... def printMethod(self):
... pass
... def code(self):
... pm = self.printMethod
... self.printMethod()
... pm()
...
>>> dis.dis(MyClass.code)
5 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (printMethod)
6 STORE_FAST 1 (pm)
6 9 LOAD_FAST 0 (self)
12 LOAD_ATTR 0 (printMethod)
15 CALL_FUNCTION 0
18 POP_TOP
7 19 LOAD_FAST 1 (pm)
22 CALL_FUNCTION 0
25 POP_TOP
26 LOAD_CONST 0 (None)
29 RETURN_VALUE
>>>
</code></pre>
<p>您可以看到,访问<code>pm</code>需要一个简单的<code>LOAD_FAST</code>操作,该操作从本地堆栈框架中的固定数值offest加载一个值,而访问{<cd1>}需要额外的<code>LOAD_ATTR</code>操作。在</p>
<p>当然,建立局部变量的值确实需要时间,因此必须多次使用它(就像在代码示例中一样)才能看到任何性能优势。在</p>
<p>正如@user5402指出的,由于编译器的优化,您的里程数可能会因您使用的实现而有所不同。在</p>