python - 为什么 Python 中的局部变量访问比类成员访问更快?

标签 python performance benchmarking

在尝试解决更复杂的问题时,我开始比较局部变量与成员变量的访问速度。

这里是一个测试程序:

#!/usr/bin/env python

MAX=40000000

class StressTestMember(object):
    def __init__(self):
        self.m = 0

    def do_work(self):
        self.m += 1
        self.m *= 2

class StressTestLocal(object):
    def __init__(self):
        pass

    def do_work(self):
        m = 0
        m += 1
        m *= 2

# LOCAL access test
for i in range(MAX):
    StressTestLocal().do_work()

# MEMBER access test
for i in range(MAX):
    StressTestMember().do_work()

我知道在每次迭代中实例化 StressTestMemberStressTestLocal 可能看起来是个坏主意,但在建模程序中这是有意义的,因为它们基本上是 Active Record。

经过简单的基准测试后,

  • 本地访问测试:0m22.836
  • 成员(member)访问测试:0m32.648s

本地版本速度提高了约 33%,同时仍然是同类版本的一部分。为什么?

最佳答案

self.m += 1 表示您必须查找名为 self 的局部变量,然后找到名为 m 的属性

当然,如果你只需要查找局部变量,那么不需要额外的步骤,速度会更快。

了解幕后发生的事情可能很有用:

>>> import dis
>>> dis.dis(StressTestLocal.do_work)
 18           0 LOAD_CONST               1 (0)
              3 STORE_FAST               1 (m)

 19           6 LOAD_FAST                1 (m)
              9 LOAD_CONST               2 (1)
             12 INPLACE_ADD         
             13 STORE_FAST               1 (m)

 20          16 LOAD_FAST                1 (m)
             19 LOAD_CONST               3 (2)
             22 INPLACE_MULTIPLY    
             23 STORE_FAST               1 (m)
             26 LOAD_CONST               0 (None)
             29 RETURN_VALUE        
>>> dis.dis(StressTestMember.do_work)
 10           0 LOAD_FAST                0 (self)
              3 DUP_TOP             
              4 LOAD_ATTR                0 (m)
              7 LOAD_CONST               1 (1)
             10 INPLACE_ADD         
             11 ROT_TWO             
             12 STORE_ATTR               0 (m)

 11          15 LOAD_FAST                0 (self)
             18 DUP_TOP             
             19 LOAD_ATTR                0 (m)
             22 LOAD_CONST               2 (2)
             25 INPLACE_MULTIPLY    
             26 ROT_TWO             
             27 STORE_ATTR               0 (m)
             30 LOAD_CONST               0 (None)
             33 RETURN_VALUE        

关于python - 为什么 Python 中的局部变量访问比类成员访问更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55258419/

相关文章:

python - 如何将word2vec转为glove格式

python - 如何在 Python Luigi 中使用参数

python - 如何在模块而不是文件或目录上运行 pytest?

performance - Haskell 计算性能

python - BioPython:从 Blast 输出文件中提取序列 ID

java - 让后台服务始终运行并且不会自杀或系统破坏它

java - 如何使用 Java 8 对同一个自定义对象执行多个操作

Python 基准测试 : Why for in loop is faster than simple while?

javascript - id vs 类选择基准

python - 基准测试 - posix-aio 与 libaio