Python无限整数

Python Infinite Integers

Python 3整数具有无限精度。 在实践中,这受到计算机内存的限制。

考虑以下代码:

1
2
3
i = 12345
while True:
    i = i * 123

这显然会失败。 但结果会是什么呢? 整个RAM(和页面文件)填充了这个整数(除了其他进程占用的空间)?

或者在它到达那么远之前是否有保护措施?


你可以检查一下会发生什么,而不用担心填满所有可用的内存。 您可以明确设置内存限制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
import contextlib
import resource

@contextlib.contextmanager
def limit(limit, type=resource.RLIMIT_AS):
    soft_limit, hard_limit = resource.getrlimit(type)
    resource.setrlimit(type, (limit, hard_limit)) # set soft limit
    try:
        yield
    finally:
        resource.setrlimit(type, (soft_limit, hard_limit)) # restore

with limit(100 * (1 << 20)): # 100MiB
    # do the thing that might try to consume all memory
    i = 1
    while True:
        i <<= 1

此代码消耗100%CPU(在单个内核上),消耗的内存增长非常缓慢。

原则上,你应该在某个时候得到MemoryError是否在你的计算机变成灰尘之前发生了不清楚。 CPython使用连续的内存块来存储数字,因此即使有可用的RAM但是碎片,您也可能会收到错误。

您的特定代码不应该触发它,但一般情况下,如果您尝试构造大于sys.maxsize字节的整数,也可以获得OverflowError