变量查找:为什么变量的 ** 比值的慢得多

MSe*_*ert 3 python performance

我读到过关于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
Run Code Online (Sandbox Code Playgroud)

这速度快了十倍以上。而对于数学函数来说,时间几乎相同(变量查找只多了几纳秒):

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
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么变量查找对 产生如此巨大的影响,**而对 却几乎没有影响math.sqrt

环境:

  • 蟒蛇3.5
  • Windows 10 64 位

Ilj*_*ilä 5

使用变量:

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
Run Code Online (Sandbox Code Playgroud)

使用立即值:

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
Run Code Online (Sandbox Code Playgroud)

事实证明,编译器比我们聪明,它预先计算了幂。