为什么在Python中,v*v比v**2更快?

4

我尝试测试 v*vv**2 之间的性能表现。结果如下:

# test was generated with randint(1, 999)

# 0.10778516498976387
print(timeit.timeit("sum([item*item for item in test])", number=10000, setup="from __main__ import test"))

# 0.35526178102009
print(timeit.timeit("sum([item**2 for item in test])", number=10000, setup="from __main__ import test"))

我开始这个实验的原因是我不想在列表推导式中执行相同的操作。 由于运算符只出现一次(例如,(item-3) * (item*3) 和 (item-3)**2),我认为 (item-3)**2 比 (item-3)*(item-3) 更快。但事实完全相反。 有人能解释一下为什么吗? [+] 我使用的是python3.6.0。

速度与 x**3x**2.5 相比如何? - Stephen Rauch
3
因为乘法比指数运算更快,如果Python(或底层的C数学代码或CPU)能够特殊处理平方和立方运算,采用乘法计算将会很好,但显然它并没有这样做。 - kindall
@StephenRauch 即使是 x**4 也与上述结果相同。 - Henry Kim
1个回答

5

由于*是一个深度嵌入处理器中的算术运算符,而 ** pow函数的包装器。

使用k * kk ** 2更高效,因为Python会在内部调用pow函数。


1
**并不是pow()函数的包装器。内置的pow()函数调用了PyNumber_Power(),而**被翻译成字节码BINARY_POWER并作为对PyNumber_Power()的调用进行评估。所以,是的,PyNumber_Power()比简单的乘法慢,但调用不会经过** => pow() => PyNumberPower()这个过程。 - Steven Rumbalski
@StevenRumbalski 感谢您提供的信息。您的意思是说 ** 是直接转换为字节码,即没有函数调用,还是转换为对 PyNumber_Power() 而不是 pow() 的调用? - Alistair Carscadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接