Python在左移1和2的幂时的行为有所不同

问题描述 投票:1回答:1

我试图在系统上计算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开始计算它而没有任何内存错误。尽管...
python integer out-of-memory
1个回答
0
投票
>>> 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(>一百万)TiBtebibyte !!!,因此它们两者都将在某个时刻耗尽内存。根据[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子句将不成立(因为它将为所有其他数字带来较小的开销,并且)没有人会/不应该使用如此大的指数。
    © www.soinside.com 2019 - 2024. All rights reserved.