我已经读过math.sqrt
比**
更快,今天我试过了。但有趣的是,这两者之间的时差并不是**
与变量和**
与值之间的时差:
value1 = 10.1
value2 = 0.5
%timeit value1 ** value2
# 1000000 loops, best of 3: 645 ns per loop
%timeit 10.1 ** 0.5
# 10000000 loops, best of 3: 60.7 ns per loop
这快了十倍以上。而对于数学函数,时序几乎相同(变量查找只需几个ns):
import math
%timeit math.sqrt(10.1)
# 1000000 loops, best of 3: 529 ns per loop
%timeit math.sqrt(value1)
# 1000000 loops, best of 3: 568 ns per loop
有人可以解释为什么变量查找会对**
产生如此巨大的影响,而math.sqrt
却没有什么区别吗?
环境:
答案 0 :(得分:4)
使用变量:
In [41]: def var():
....: value1 ** value2
....:
In [43]: dis.dis(var)
2 0 LOAD_GLOBAL 0 (value1)
3 LOAD_GLOBAL 1 (value2)
6 BINARY_POWER
7 POP_TOP
8 LOAD_CONST 0 (None)
11 RETURN_VALUE
使用立即值:
In [44]: def imm():
....: 10.1 ** 0.5
....:
In [45]: dis.dis(imm)
2 0 LOAD_CONST 3 (3.1780497164141406)
3 POP_TOP
4 LOAD_CONST 0 (None)
7 RETURN_VALUE
原来,编译器超出了我们的预算并计算了功率。