为什么Python要花很长时间来计算1**4**4**4?
我在Python2和Python3中都遇到了一个奇怪的问题为什么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
>>> 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
。啊,好的。我想就是这样。谢谢大家。