MLi*_*ter 4 python scope global-variables
我想知道在使用以下方法访问同一类的方法内的类变量(dict)时性能是否有任何差异:
self.class_variable_dict.add(some_key, some_value)
Run Code Online (Sandbox Code Playgroud)
和
ClassName.class_variable_dict.add(some_key, some_value)
Run Code Online (Sandbox Code Playgroud)
显然,只要没有具有相同名称的实例变量,两者都可以工作,但是有任何理由/用例我们应该优先选择其中一个吗?
通过ClassName
而不是via 访问它self
会稍快一些,因为如果通过self
它访问它必须首先检查实例名称空间.但是我不认为差异是完全重要的,除非你有分析信息表明它是.
因此,我建议您使用您认为更容易阅读/理解为人类的任何一个.
从语义上讲,只有当class_variable_dict
变量在某处被遮蔽时,它们才会有所不同- 特别是,如果(a)self
定义了同名的变量; 或(b)self
是子类的实例,该子ClassName
类(或其子类之一仍然是其子类ClassName
)定义了同名的变量.如果这些都不是真的,那么它们在语义上应该是相同的.
编辑:
德尔南有一个好点:有些因素可能会更快.我坚持认为差异将是微不足道的,除非它处于非常紧密的循环中.为了测试它,我创建了我能想到的最紧密的循环,并将其计时timeit
.结果如下:
基于几次运行,看起来误差条约为1秒 - 即,这是一个统计上显着的差异,但可能不值得担心.这是我的测试代码:
import timeit
setup='''
class A:
var = {}
def f1(self):
x = A.var
def f2(self):
x = self.var
a = A()
'''
print 'access via class var: %.3f' % timeit.timeit('a.f1()', setup=setup, number=100000000)
print 'access via inst var: %.3f' % timeit.timeit('a.f2()', setup=setup, number=100000000)
Run Code Online (Sandbox Code Playgroud)