在 python 中使用魔术方法比使用运算符更快吗?
Is using magic methods quicker than using operator in python?
我想问一下,使用魔术方法(如 int.__add__()
)是否比使用运算符(如 +
)更快?
即使是一点点也会有所不同吗?
谢谢。
这是 3 种不同添加方式的反汇编字节码。
import dis
def add1(a, b):
return a + b
dis.dis(add1)
2 0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_ADD
6 RETURN_VALUE
def add2(a, b):
return a.__add__(b)
dis.dis(add2)
2 0 LOAD_FAST 0 (a)
2 LOAD_ATTR 0 (__add__)
4 LOAD_FAST 1 (b)
6 CALL_FUNCTION 1
8 RETURN_VALUE
def add3(a, b):
return int.__add__(a, b)
dis.dis(add3)
2 0 LOAD_GLOBAL 0 (int)
2 LOAD_ATTR 1 (__add__)
4 LOAD_FAST 0 (a)
6 LOAD_FAST 1 (b)
8 CALL_FUNCTION 2
10 RETURN_VALUE
a+b
生成最简单的字节码,但我希望 BINARY_ADD
的解释器代码只是调用第一个参数的 __add__()
方法,所以它实际上与 [=14 相同=].
int.__add__(a, b)
看起来可能更快,因为它不必为特定对象查找方法,但查找 int.__add__
属性可能同样昂贵。
如果你真的想找出最好的,我建议你 运行 基准测试。
我想问一下,使用魔术方法(如 int.__add__()
)是否比使用运算符(如 +
)更快?
即使是一点点也会有所不同吗?
谢谢。
这是 3 种不同添加方式的反汇编字节码。
import dis
def add1(a, b):
return a + b
dis.dis(add1)
2 0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_ADD
6 RETURN_VALUE
def add2(a, b):
return a.__add__(b)
dis.dis(add2)
2 0 LOAD_FAST 0 (a)
2 LOAD_ATTR 0 (__add__)
4 LOAD_FAST 1 (b)
6 CALL_FUNCTION 1
8 RETURN_VALUE
def add3(a, b):
return int.__add__(a, b)
dis.dis(add3)
2 0 LOAD_GLOBAL 0 (int)
2 LOAD_ATTR 1 (__add__)
4 LOAD_FAST 0 (a)
6 LOAD_FAST 1 (b)
8 CALL_FUNCTION 2
10 RETURN_VALUE
a+b
生成最简单的字节码,但我希望 BINARY_ADD
的解释器代码只是调用第一个参数的 __add__()
方法,所以它实际上与 [=14 相同=].
int.__add__(a, b)
看起来可能更快,因为它不必为特定对象查找方法,但查找 int.__add__
属性可能同样昂贵。
如果你真的想找出最好的,我建议你 运行 基准测试。