gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:17 25 4
gpt4 key购买 nike

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

这里是一个测试程序:

#!/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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com