我正在阅读学习 Python 第 5 版,我需要对这一段进行更多解释:
The __add__ method of strings, for example, is what really performs concatenation; Python maps the first of the following to the second internally, though you shouldn't usually use the second form yourself( it's less intuitive, and might even run slower):
>>> S+'NI!'
'spamNI!'
>>> S.__add__('NI!')
'spamNI!'
所以我的问题是,为什么它会运行得更慢?
最佳答案
>>> def test(a, b):
... return a + b
...
>>> def test2(a, b):
... return a.__add__(b)
...
>>> import dis
>>> dis.dis(test)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 RETURN_VALUE
>>> dis.dis(test2)
2 0 LOAD_FAST 0 (a)
3 LOAD_ATTR 0 (__add__)
6 LOAD_FAST 1 (b)
9 CALL_FUNCTION 1
12 RETURN_VALUE
1 BINARY_ADD
指令而不是 2 条指令:LOAD_ATTR
和 CALL_FUNCTION
.自 BINARY_ADD
做(几乎)相同的事情(但在 C 中)那么我们可以期望它(稍微)更快。不过,差异几乎不明显。
旁注:所以这类似于汇编的工作方式。通常,当有一条指令与一系列指令执行相同的操作时,它的性能会更好。例如在 x64 LEA
指令可以用一系列其他指令代替。但它们的表现不会那么好。
但是有一个陷阱(这解释了为什么我开始谈论 x64 汇编)。有时一条指令实际上性能更差。见臭名昭著的LOOP instruction .这种违反直觉的行为可能有很多原因,例如:有点不同的假设、未优化的实现、历史原因、错误等等。
结论:在 Python 中 +
理论上应该比__add__
快但始终衡量。
关于python - __add__ 和 + 运算符之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57004214/