在Python中访问类变量的性能

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)

显然,只要没有具有相同名称的实例变量,两者都可以工作,但是有任何理由/用例我们应该优先选择其中一个吗?

Edw*_*per 6

通过ClassName而不是via 访问它self快一些,因为如果通过self它访问它必须首先检查实例名称空间.但是我不认为差异是完全重要的,除非你有分析信息表明它是.

因此,我建议您使用您认为更容易阅读/理解为人类的任何一个.

从语义上讲,只有当class_variable_dict变量在某处被遮蔽时,它们才会有所不同- 特别是,如果(a)self定义了同名的变量; 或(b)self是子类的实例,该子ClassName类(或其子类之一仍然是其子类ClassName)定义了同名的变量.如果这些都不是真的,那么它们在语义上应该是相同的.

编辑:

德尔南有一个好点:有些因素可能会更快.我坚持认为差异将是微不足道的,除非它处于非常紧密的循环中.为了测试它,我创建了我能想到的最紧密的循环,并将其计时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)
Run Code Online (Sandbox Code Playgroud)