Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python *vs**用于2次幂运算_Python_Exponent - Fatal编程技术网

Python *vs**用于2次幂运算

Python *vs**用于2次幂运算,python,exponent,Python,Exponent,所以我经常看到人们编写代码,当他们希望看到给定值的平方版本时,他们会写出x*x而不是x**2。在这两点之间是否存在很大的效率重叠,在python中,给定的函数不仅仅是被使用的,还是仅仅是一个风格点?我更愿意使用**操作符,但如果它会导致一个巨大的错误,我是否应该做10亿次,我知道,我有点想知道。另外,如果我在数量级上错误地认为一个操作取代了另一个操作,我也希望在这方面得到纠正。也就是说,如果**比x*x更有效,那么我也想知道为什么。事实上,两者在总成本上可能非常相似: >>>

所以我经常看到人们编写代码,当他们希望看到给定值的平方版本时,他们会写出x*x而不是x**2。在这两点之间是否存在很大的效率重叠,在python中,给定的函数不仅仅是被使用的,还是仅仅是一个风格点?我更愿意使用**操作符,但如果它会导致一个巨大的错误,我是否应该做10亿次,我知道,我有点想知道。另外,如果我在数量级上错误地认为一个操作取代了另一个操作,我也希望在这方面得到纠正。也就是说,如果**比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

这似乎表明在100000次迭代中,
x*x
的速度稍微快一点。

我不同意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所演示的,

我想人们使用<代码> x*x<代码>代替<代码> x** 2 <代码>,因为它在所有语言中都是有效的,而<代码> x** 2 < /C> >在爪哇/c/C++中不起作用。因此,我想大多数例子的原因都是无知。不过,我很想知道是否存在效率差异/数值差异。因此,这本身只是一个风格概念。我一直认为它只是与c中的pow()函数类似的东西,因为它进行了函数调用,我在该语言中看到了这种需要,但在python中,因为它是内置的。我只是不明白为什么不用它。在我看来,只要操作符是已知的,并且被理解的,它就比其他操作符更具表现力。不过,感谢您提供的片段。对于10e6来说,这就是它的价值所在,但它的时间复杂度会呈指数级增长,还是会持续增长?我知道在这个宏大的计划中,这只会有一点无关紧要,但是做Euler项目的问题,教自己Python语言,时间,甚至是四分之一秒,都会让我有点困惑。不。求幂运算比传统CPU上的乘法运算慢得多。您的基准测试没有显示这一点,因为时间主要取决于函数调用(我猜)或其他动态Python恶作剧的成本。在编译语言中,差异是巨大的。即使在Python中,我也可以想象它在没有函数调用的紧循环中产生了巨大的变化,但我没有进行基准测试。无论如何,这(不幸的)远远不是对许多应用程序的过早优化。@KonradRudolph:这不是CPU的事情;Python整数求幂不调用任何CPU求幂指令。都是软件。在Python2中,即使去掉函数调用,由于所有其他开销,差异大约为6%;在Python3中,由于bignum求幂代码不能很好地处理问题。@user2357112我不认为这会使事情变得更好。与乘法相比,在软件中实现指数运算会使这一过程变得更加缓慢。您的基准测试不足以显示这种差异,因为操作太快,计时器的精度相对较低。如果它在函数中或函数外,为什么会产生差异(如此巨大!)?@moose:很可能是因为全局变量查找是dict查找,虽然局部变量查找是索引到数组中,但现在我有点困惑了,我看到它实际上考虑了巨大的速度差,这表示我的初始点。我不认为这会有那么大的区别,也不认为这会导致在函数范围内或函数范围外的区别。有时候你的语言真奇怪。@user2357112你说的很有趣,你能进一步解释一下吗?我认为locals()返回dict以及globals()……而且,看起来您在Python3上计时了,而另一个人在Python2上计时了。在这种情况下,Python3的bignum求幂比Python2的求幂性能差得多;在Python2上,
n**2
n*n
的计时与另一个答案中的计时几乎相同。