基本上,表达式0.4 * a
始终比a * 0.4
快得多,而且令人惊讶的是.a
为整数.我也不知道为什么.
我推测这是一个LOAD_CONST LOAD_FAST
字节码对比LOAD_FAST LOAD_CONST
"更专业"的情况,我会对这个解释完全满意,只是这个怪癖似乎只适用于相乘变量类型不同的乘法.(顺便说一句,我再也找不到我在GitHub上找到的这份《字节码指令对受欢迎程度排名》的链接了,有人有链接吗?)
无论如何,以下是微观基准:
$ python3.10 -m pyperf timeit -s"a = 9" "a * 0.4"
Mean +- std dev: 34.2 ns +- 0.2 ns
$ python3.10 -m pyperf timeit -s"a = 9" "0.4 * a"
Mean +- std dev: 30.8 ns +- 0.1 ns
$ python3.10 -m pyperf timeit -s"a = 0.4" "a * 9"
Mean +- std dev: 30.3 ns +- 0.3 ns
$ python3.10 -m pyperf timeit -s"a = 0.4" "9 * a"
Mean +- std dev: 33.6 ns +- 0.3 ns
正如你所看到的--在彩车排在第一位(第二和第三)的比赛中--它更快.
所以我的问题是,这种行为是从哪里来的?我90%确定这是CPython的实现细节,但我不太熟悉低级指令来确定这一点.