我试图在系统上计算1 << sys.maxsize
,python立即给了我一个内存错误,但是当我尝试执行2 ** maxsize
时,python开始计算它而没有任何内存错误。尽管1 << a等于2 ** a。 (对于所有肯定的a)为什么会有这种行为?
情况1:
import sys
1 << sys.maxsize
情况2:
import sys
2 ** sys.maxsize
情况1:]的结果>
--------------------------------------------------------------------------- MemoryError Traceback (most recent call last) <ipython-input-41-0d82f9d0b2eb> in <module>() ----> 1 1 << sys.maxsize MemoryError:
[的结果
# This kept on going without any memory error
我试图在我的系统上计算1 << sys.maxsize,python立即给了我一个内存错误,但是当我尝试做2 ** maxsize python开始计算它而没有任何内存错误。尽管...
>>> import sys, math
>>> sys.maxsize, (sys.maxsize + 1) // 8, math.log((sys.maxsize + 1) // 8, 1024)
(9223372036854775807, 1152921504606846976, 6.0)
如上所述,这两个操作都没有意义,因为(在[[64bit上)结果将采用
)源代码中,1 EiB(exbibyte),即1048576(>一百万)TiB(tebibyte !!!,因此它们两者都将在某个时刻耗尽内存。根据[Python 3.docs]: Built-in Types - Numeric Types — int, float, complex:
整数具有无限精度。在(C
Python的int值表示为
unsigned short []
(longintrepr.h),两个函数分别是< [long_lshift和long_pow([GitHub]: python/cpython - (master) cpython/Objects/longobject.c)。这是这两个函数的工作原理(的简化版本:
lshift:尝试分配所需的字节以保存final结果-失败(几乎立即失败)pow:执行连续的乘法,增加
结果所需的空间(您可以发出- intermediate
2 ** sys.maxsize
并查看Task Manager中使用的内存如何增长,如果在[[Python控制台中,按Ctrl + Break,内存将下降)。乘法是一项昂贵的操作(CPU 并且在时间上是明智的)(即使有加速作用),也涉及内存分配/复制操作,因此,如果有足够的时间,则中间结果将不断增长,直到不再使用适合最大的可用内存块,因此它将失败(具有相同的错误)我不确定为什么对于数字2(作为基数),2 nd函数不会简单地调用1 st,但是我想附加的if子句将不成立(因为它将为所有其他数字带来较小的开销,并且)没有人会/不应该使用如此大的指数。