* 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 所示。
所以我经常看到人们在编写代码时,当他们希望看到给定值的平方版本时,他们会写出 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 所示。