python - 使用魔术方法比在 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__()
方法,所以它实际上与a.__add__(b)
.
int.__add__(a, b)
看起来它可能会更快,因为它不必为特定对象找到方法,但查找int.__add__
属性可能同样昂贵。
如果您真的想找出哪个最好,我建议您运行基准测试。
推荐阅读
- ruby-on-rails - 如何强制 ActiveStorage::Attached#attach 同步运行——禁用异步行为
- flutter - Scrolling resets widgets flutter
- django - 如何在 Django 模板中使用换行符
- python - 如何为每日数据大小变化创建动态 INT 变量
- firebase - 是否有必要为 Firebase 身份验证清理数据?
- c# - Asp.net 控件在后面的代码中不可访问。出现错误'名称'txtUserEmail'在当前上下文中不存在'
- angular - Angular - 通过当前延迟加载的模块更改标题组件
- c++ - 如何分块读取进程内存并扫描值的确切地址?
- python - 无法导入pygame
- c# - WPF C# 应用程序不显示加载 gif