2014-09-25 108 views
1

我遇到了一個奇怪的問題,在這兩個的Python 2和Python 3爲什麼Python需要永遠評估1 ** 4 ** 4 ** 4 ** 4?

>>> 1**4**4**4 
1L 
which seems fine, but when I do this: 
>>> 1**4**4**4**4 

它淹沒了CPU和永遠不會完成。

爲什麼?

我也運行這些來查看它是否與權力的功能,或與**運營商,它似乎只是**運營商。

>>> (((((1**4)**4)**4)**4)**4) 
1 
>>> pow(pow(pow(pow(pow(pow(1,4),4),4),4),4),4) 
1 
>>> pow(pow(pow(pow(pow(pow(1.0,4),4),4),4),4),4) 
1.0 
>>> pow(pow(pow(pow(pow(pow(1L,4),4),4),4),4),4) 
1L 
>>> 1L**4**4**4 
1L 

我也試過另一種語言,它似乎只是Python。

爲什麼不能以微秒爲單位進行評估?有人可以解釋CPU時間在做什麼嗎?

對於我不理解的操作順序,有沒有非直觀的東西?

+0

另一件需要注意的事情是,窺孔優化器將預先計算最右邊的'4 ** 4',所以真正的比較是在'1 ** 4 ** 256'和'1 ** 4 ** 4 * * 256'。 – roippi 2014-09-25 17:42:41

+0

好的。我覺得是這樣。謝謝大家。 – 2014-09-25 17:51:37

回答

2

在數學上,取冪是右結合,所以

1**4**4**4**4 

是不一樣的

(((((1**4)**4)**4)**4)**4) 
6

隨着**操作者,所述綁定規則是這樣的,在加括號表達式右手方先評估

1 ** 4 ** 4 ** 4 ** 4以下順序進行評估:

1 ** (4 ** (4 ** (4 ** 4))) 

,它是生產和分配是需要所有的時間右邊的大量內存:

>>> 4 ** 4 ** 4 
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096L 
>>> 4 ** 4 ** 4 ** 4 
# ... wait a long time as Python allocates GBs of memory ... 

引述** documentation

因此,在一個沒有語言化的動力序列中, d元運算符,運營商是從右向左計算

2

因爲它不是做

(((((1**4)**4)**4)**4)**4) 

這是做

1**(4**(4**(4**(4**4)))) 

注意,後者必須計算數量巨大在簡單地將1提升到該結果之前。

0

右結合:

>>> 2 ** 2 ** 3 
256 
>>> 
0

這是緩慢的,因爲它必須評估4**4**4**4,這是乘法確實得到確切的結果。

(不要忘了,冪是右結合的。)

附:4**4**413407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096,所以通過乘法計算4**4**4**4將花費非常很長的時間。