当讨论Exponentials in python x.**y vs math.pow(x, y)问题时,
Alfe stated在python中没有好的理由使用math.pow
来代替内置的**
运算符。在
timeit shows that math.pow is slower than ** in all cases. What is math.pow() good for anyway? Has anybody an idea where it can be of any advantage then?
我们试图用一些timeit
的论点来说服对方,他是目前为止的赢家;—)——至少下面的timeit
结果似乎证实了math.pow is slower than ** in all cases
。在
import timeit
print timeit.timeit("math.pow(2, 100)",setup='import math')
print timeit.timeit("2.0 ** 100.0")
print timeit.timeit("2 ** 100")
print timeit.timeit("2.01 ** 100.01")
输出:
^{pr2}$我们观察到的差异有没有简单的解释?
math.pow
和{
编辑:
实际上,power操作符在示例中表现得很好的原因是Python在编译时很可能有folded the constant。在
这将产生以下输出:
^{pr2}$您可以在这里看到这个运行:http://ideone.com/5Ari8o
所以在本例中,您可以看到它实际上并没有对幂运算符与
math.pow
的性能进行公平的比较,因为结果已经被预先计算并缓存了。当您进行3.0 ** 100
时,不执行任何计算,只返回结果。这比运行时执行的任何求幂运算都要快得多。这就是最终解释你的结果的原因。在为了更公平地进行比较,您需要使用变量强制在运行时进行计算:
我尝试在我的计算机上使用python 3.4.1对此进行快速基准测试:
结果:
所以看起来,转换成float占用了相当多的执行时间。在
我还为
math.pow
添加了一个基准测试,注意这个函数与内置的pow
有关更多信息,请参见这个:Difference between the built-in pow() and math.pow() for floats, in Python?相关问题 更多 >
编程相关推荐