python - 在 Python 中访问类变量的性能

标签 python global-variables scope

我想知道在同一类的方法内访问类变量(字典)时性能是否有任何差异:

self.class_variable_dict.add(some_key, some_value)

ClassName.class_variable_dict.add(some_key, some_value)

显然,只要没有同名的实例变量,两者都可以工作,但是有什么理由/用例我们应该更喜欢一个而不是另一个吗?

最佳答案

通过 ClassName 而不是通过 self 访问它会稍微更快,因为如果你通过 self 访问它> 它必须首先检查实例命名空间。但我不认为差异会很显着,除非您有分析信息表明它是显着的。

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

从语义上讲,只有当 class_variable_dict 变量在某处被隐藏时它们才会不同——特别是,如果 (a) self 定义了一个同名的变量;或 (b) selfClassName 子类的实例,并且该子类(或其基类之一仍然是 ClassName 的子类) ) 定义了一个同名变量。如果这些都不成立,那么它们在语义上应该是相同的。

编辑:

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)

关于python - 在 Python 中访问类变量的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10703605/

相关文章:

python - 如何将不确定性表达式(例如 3.23 +/- 0.01)从字符串转换为 float ?

python - 使用 Lat-Lon 和时间序列 Pandas 进行操作

c# - 在紧凑的框架中以多种形式提供变量

python - 更改列表的元素与更改列表本身

python - Python 有整数数据类型吗?

python - 使用新数据更新 Pandas 数据框,同时保留现有 ID 号

c - 如何在linux内核中重用变量?

javascript - 在 chrome 扩展中获取 executeScript 之外的变量

javascript - 为什么 setInterval() 中的参数始终不发送到函数?

java - 从类方法内访问类属性 - Java