python - 如何在 Python 中更高效地分配以及它在内部是如何工作的?
问题描述
在 Python 中是
a,b = b,a
比效率更高
temp = a
a = b
b = temp
? 它在内部是如何工作的?
解决方案
作为实现细节,它的速度非常快,但不足以在大多数程序中产生有意义的差异。它更快,因为它避免了STORE
/LOAD
对有利于ROT_TWO
指令的操作,该指令在将两个源变量加载到程序堆栈后使用,在STORE
正常返回之前翻转堆栈的顶部两个元素的顺序。
如前所述,加速是微不足道的(在一些试验中,交换比显式临时更快,但只是个位数纳秒的问题,这几乎无关紧要),但阅读明显的交换更干净,所以人们在需要的时候倾向于喜欢它。
对于内部,该dis
模块很有帮助:
>>> import dis
>>> dis.dis('a, b = b, a')
1 0 LOAD_NAME 0 (b)
2 LOAD_NAME 1 (a)
4 ROT_TWO
6 STORE_NAME 1 (a)
8 STORE_NAME 0 (b)
10 LOAD_CONST 0 (None)
12 RETURN_VALUE
>>> dis.dis('temp = a; a = b; b = temp')
1 0 LOAD_NAME 0 (a)
2 STORE_NAME 1 (temp)
4 LOAD_NAME 2 (b)
6 STORE_NAME 0 (a)
8 LOAD_NAME 1 (temp)
10 STORE_NAME 2 (b)
12 LOAD_CONST 0 (None)
14 RETURN_VALUE
您可以看到交换需要更少的字节码指令,并且连续执行更多相同的指令(这可能有助于缓存利用率一点点)。确切的指令根据您执行它的位置(_NAME
可能是_FAST
或_GLOBAL
类似的)而有所不同,因此当指令更昂贵时可能会有更多的性能提升(我的微基准测试是针对使用_FAST
开销最小的指令的函数本地人; 相对而言,在全局范围内运行可能会使切换音调更快)。但同样,面对更短、更简洁的代码与更长、更丑陋的代码之间的选择,这一切都是微不足道的。
推荐阅读
- c++ - ceil、floor 和 round 转换为整数时会遇到精度损失问题吗?
- javascript - 运行 Promise 时如何更新 VUE 元素
- r - R中是否有一种方法可以从带有断点的向量创建一个具有某些间隔边界的字符向量?
- php - 显示没有外部来源的邮件内容(图像、css 等)
- excel - 插入从 Excel 到 Word 的范围作为大写
- ios - Azure Pipelines 作业卡在构建 iOS 版本的 React Native 应用程序
- css - 将缩进块引用内的表格缩进删除到全身宽度
- react-native - RNFirebaseAdMobPackage throws error in react-native version 0.60.4
- python - 寻找钟面的方向
- reactjs - 如何使用 worker-loader 配置创建反应应用程序