python - __add__ 和 + 运算符之间的性能差异

标签 python performance

我正在阅读学习 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_ATTRCALL_FUNCTION .自 BINARY_ADD做(几乎)相同的事情(但在 C 中)那么我们可以期望它(稍微)更快。不过,差异几乎不明显。

旁注:所以这类似于汇编的工作方式。通常,当有一条指令与一系列指令执行相同的操作时,它的性能会更好。例如在 x64 LEA指令可以用一系列其他指令代替。但它们的表现不会那么好。

但是有一个陷阱(这解释了为什么我开始谈论 x64 汇编)。有时一条指令实际上性能更差。见臭名昭著的LOOP instruction .这种违反直觉的行为可能有很多原因,例如:有点不同的假设、未优化的实现、历史原因、错误等等。

结论:在 Python 中 + 理论上应该比__add__快但始终衡量

关于python - __add__ 和 + 运算符之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57004214/

相关文章:

python - 使用 Python 自动化旧的 DOS 应用程序

python - 由多个激活函数组成的神经网络

python - Tkinter ;新类(class)中的顶级

android - 多步骤流程中的单个 Activity 多个 fragment/单独的 Activity ?

performance - 在 React Native 中有效更新大型平面列表中的所有项目

html & css 效率性能问题

python - 在python字典列表中查找最低值

python - 使用 if 语句时使用多个 sys.argv 时索引超出范围

java - `scale` 中的 `BigDecimal#divide()` 越高,速度越快?

php - 如何通过单个查询从带有 where 过滤器的 30k MySQL 表中快速选择 3 条随机记录?