我想知道访问类变量(字典)时性能是否有任何差异在同一个类的方法内 using:
self.class_variable_dict.add(some_key, some_value)
and
ClassName.class_variable_dict.add(some_key, some_value)
显然,只要没有同名的实例变量,两者都可以工作,但是是否有任何原因/用例我们应该选择其中一个而不是另一个?
通过访问它ClassName
而不是通过self
将slightly更快,因为如果您通过以下方式访问它self
它必须首先检查实例名称空间。但我认为差异根本不会很大,除非您有分析信息表明差异很大。
因此,我建议使用您认为作为人类更容易阅读/理解的一种。
从语义上讲,只有当class_variable_dict
变量在某处被遮蔽——特别是,如果 (a)self
定义一个同名变量;或 (b)self
是一个子类的实例ClassName
,以及该子类(或其基类之一,仍然是ClassName
) 定义了一个同名的变量。如果这两者都不正确,那么它们在语义上应该是相同的。
Edit:
delnam有一个很好的观点:有些因素可能会使两者更快。我坚持我的观点,除非是在一个非常非常紧密的循环中,否则差异是微不足道的。为了测试它,我创建了我能想到的最紧密的循环,并用它计时timeit
。结果如下:
-
通过类 var 访问:20.226秒
-
通过 inst var 访问:23.121秒
根据几次运行,看起来误差线大约为 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)