那么这两个与性能是否完全等价(即生成的代码是否完全等价):
class A(object):
const = 'abc'
def lengthy_op(self):
const = self.const
for i in xrange(AVOGADRO):
# do something which involves reading const
以及:
const = 'abc'
class A(object):
def lengthy_op(self):
global const
for i in xrange(AVOGADRO):
# do something which involves reading const
它是快还是慢实际上取决于您的作用域,作用域存储在字典中,字典越小,访问速度就越快。因为字典是作为哈希集实现的,所以查找性能是O(1)。你知道吗
无论何时尝试访问变量,Python都将按以下顺序遍历作用域:
globals()
访问)list
、int
等。。你知道吗访问函数/类属性的工作方式类似,但涉及:
__getattribute__
__dict__
__getattr__
所有继承的类也是如此。你知道吗
邓肯完美地回答了你剩下的问题
不,虽然差异不大,但它们并不完全相等。你知道吗
这将创建一个局部变量,以便对const的任何访问都将使用
LOAD_FAST
操作码。你知道吗无论是否有冗余
global const
,它都使用LOAD_GLOBAL
来访问全局变量const
、xrange
和AVOGADRO
的值。你知道吗在C Python中
LOAD_GLOBAL
将执行快速字典查找以访问变量(快速是因为全局变量在字典中只使用字符串键,哈希值是预先计算的)。LOAD_FAST
另一方面,简单地访问第一、第二、第三等局部变量,这是一个数组索引操作。你知道吗Python的其他版本(例如PyPy)可能能够优化对全局变量的访问,在这种情况下,可能根本没有任何区别。你知道吗
第一个代码(以
n=i+const
作为循环体)反汇编为:而第二块给出:
Python不会生成全局的本地副本,因为没有简单的方法可以确保在代码运行时全局值不会更改。任何东西,甚至另一个线程或调试器,都可以在循环执行时修改该值。你知道吗
相关问题 更多 >
编程相关推荐