python中pow_python – 为什么pow(x,y)的时间复杂度为O(1),而x ** y为O(n)?
聲明是錯誤的.
> pow或多或少與**相同.
> pow和**如果它們的參數是整數,則執行整數取冪. (Python 3具有自動bignum支持,因此,例如,a ** b總是給出精確的積分結果,即使a或b非常大.)這需要通過平方乘以取冪的O(log(b))乘法,但bignum乘法不是恒定時間,因此時間復雜度取決于所使用的乘法算法的細節. (另外,Python并沒有通過平方來使用取冪,但Python使用的仍然需要O(log(b))乘法.)
>另一方面,math.pow是不同的.它總是進行浮點求冪,并且始終為O(1). O(1)的復雜性不是因為它比pow或**更有效;這是因為浮點犧牲了準確性和范圍.對于整數求冪的非常數復雜性實際上很重要的情況,math.pow將提供更不精確的結果或拋出OverflowError.
更多詳細信息(來自于Stack Overflow上的other questions,以及Python源代碼中的一些內容):
> pow(參見here)和**(參見here)都調用相同的PyNumber_Power函數.在實踐中,**可以更快,因為它避免了額外的符號查找和函數調用的開銷.
>可以在here看到pow / **的整數實現.
> math.pow,另一方面,總是調用C庫的pow函數,它總是進行浮點數學運算. (見here和here.)這通常更快,但不準確.有關可能實施pow的一種方法,請參見here.
>對于浮點數,pow / **也調用C庫的pow函數,所以沒有區別.見here和here.
如果您想自己玩這些命令,可以將這些命令粘貼到您的IPython會話中:
import timeit
def show_timeit(command,setup):
print(setup + '; ' + command + ':')
print(timeit.timeit(command,setup))
print()
# Comparing small integers
show_timeit('a ** b','a = 3; b = 4')
show_timeit('pow(a,b)','a = 3; b = 4')
show_timeit('math.pow(a,'import math; a = 3; b = 4')
# Compare large integers to demonstrate non-constant complexity
show_timeit('a ** b','a = 3; b = 400')
show_timeit('pow(a,'a = 3; b = 400')
show_timeit('math.pow(a,'import math; a = 3; b = 400')
# Compare floating point to demonstrate O(1) throughout
show_timeit('a ** b','a = 3.; b = 400.')
show_timeit('pow(a,'a = 3.; b = 400.')
show_timeit('math.pow(a,'import math; a = 3.; b = 400.')
總結
以上是生活随笔為你收集整理的python中pow_python – 为什么pow(x,y)的时间复杂度为O(1),而x ** y为O(n)?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现金净流入怎么计算
- 下一篇: 银行卡冻结了怎么解决发工资 银行卡冻结了