* vs ** 对于 2 的幂运算

* vs ** for a power of 2 operation

所以我经常看到人们在编写代码时,当他们希望看到给定值的平方版本时,他们会写出 x*x 而不是 x**2。这两点之间是否有很大的效率重叠,python 中的给定函数不只是被使用,还是只是一个风格点?我宁愿使用 ** 运算符,但如果它会导致巨大的失误,我是否应该进行十亿次操作,我知道太多了,我有点想知道。另外,如果我弄错了一个接管另一个操作的数量级,我也希望得到纠正。即,如果 ** 比 x*x 更有效,那么我也想知道为什么。

实际上,两者的总成本可能非常相似:

>>> def s1(x):
...   return x * x
...
>>>
>>> def s2(x):
...   return x ** 2
...
>>>
>>> from dis import dis
>>>
>>> dis(s1)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                0 (x)
              6 BINARY_MULTIPLY
              7 RETURN_VALUE
>>> dis(s2)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (2)
              6 BINARY_POWER
              7 RETURN_VALUE
>>>

我认为您可能过早地进行了优化,即使对于数百万或数十亿次迭代也是如此。除非您已将此确定为瓶颈,否则请使用最适合您的方式。

并且,为了完整起见,timeit 结果:

>>> timeit.Timer("s1(10)", 'from __main__ import s1').timeit(100000)
0.0186597650628606
>>> timeit.Timer("s2(10)", 'from __main__ import s2').timeit(100000)
0.018789616358585448

这似乎表明 x * x 在 100000 次迭代中稍微快

我不同意g.d.d.c,乘法要快得多!

"""Evaluating the difference in execution time between n*n and n**2"""

from time import time

n = 2
t = time()
for i in range(5000000):
    n**2
print("Time for n**2:\t%0.3f" % (time()-t))
t = time()
for i in range(5000000):
    n*n
print("Time for n*n:\t%0.3f" % (time()-t))


def test(n):
    """
    Difference in execution time between n*n and n**2
    within function scope.
    """
    t = time()
    for i in range(5000000):
        n**2
    print("Time for n**2:\t%0.3f" % (time()-t))
    t = time()
    for i in range(5000000):
        n*n
    print("Time for n*n:\t%0.3f" % (time()-t))

test(n)

结果:

Time for n**2: 2.324496030807495
Time for n*n:  0.5879969596862793
Time for n**2: 2.0771241188049316
Time for n*n:  0.2894318103790283

您可以看到乘法在函数外快了大约 4 倍,在函数内快了 7 倍。我无法解释这两个测试之间的区别,我不确定 n*n 和 n**2 之间的区别,但这可能与 Python 是一种解释性语言这一事实​​有关,并且处理后者需要更多时间,即使处理器操作非常相似,如 g.d.d.c 所示。