为什么Python要花很长时间来计算1**4**4**4?

为什么Python要花很长时间来计算1**4**4**4?,python,operators,exponentiation,Python,Operators,Exponentiation,我在Python2和Python3中都遇到了一个奇怪的问题 >>> 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

我在Python2和Python3中都遇到了一个奇怪的问题

>>> 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时间的影响吗


关于运算顺序是否有一些我不理解的非直觉的东西?

从数学上讲,求幂是右关联的,所以

1**4**4**4**4
不一样

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

从数学上讲,求幂是右联想的,所以

1**4**4**4**4
不一样

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

使用
**
操作符,绑定规则是这样的,即在未解析表达式中,首先计算右侧

您的
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 ...
引述:

因此,在幂运算符和一元运算符的非焓化序列中,运算符从右向左求值


使用
**
操作符,绑定规则是这样的,即在未解析表达式中,首先计算右侧

您的
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 ...
引述:

因此,在幂运算符和一元运算符的非焓化序列中,运算符从右向左求值


因为它不是在做什么

(((((1**4)**4)**4)**4)**4)
它正在做什么

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

请注意,后者必须先计算一个巨大的数字,然后再简单地将1提高到该结果。

,因为它没有这样做

(((((1**4)**4)**4)**4)**4)
它正在做什么

1**(4**(4**(4**(4**4))))
请注意,后者必须先计算一个巨大的数字,然后才能简单地将1提升为该结果。

右关联性:

>>> 2 ** 2 ** 3
256
>>> 
右结合性:

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

它的速度很慢,因为它必须求值
4**4**4**4
,这是通过乘法得到准确的结果

(别忘了指数运算是正确的。)


p.S.
4**4**4
134078079299425970957402499820584612747936582059239377723561443721764030073546976801874298166903476900318581864860508537753882811946569946433649006084096
,因此通过乘法计算
4**4**4**4**,很长时间。

它很慢,因为它必须求值
4**4**4**4
,这是通过乘法得到精确结果

(别忘了指数运算是正确的。)


p.S.
4**4**4
134078079299425970957402499820584612747936582059239377723561443721764030073546976801874298166903476900318581864860508537753882811946569946433649006084096
,因此通过乘法计算
4**4**4**4**,很长时间。

另一件需要注意的事情是,窥视孔优化器将预先计算最右边的
4**4
,因此实际上比较的是
1**4**256
1**4**4**256
。啊,好的。我想就是这样。谢谢大家。另外需要注意的是,窥视孔优化器将预先计算最右边的
4**4
,因此实际上比较的是
1**4**256
1**4**4**256
。啊,好的。我想就是这样。谢谢大家。