2015-09-20 3 views
5

Целочисленные числа Python 3 имеют unlimited precision. На практике это ограничено памятью компьютера.Python Бесконечные целые числа

Рассмотрим followng код:

i = 12345 
while True: 
    i = i * 123 

Это, очевидно, потерпеть неудачу. Но что будет результатом этого? Вся ОЗУ (и файл страницы) заполнена этим одним целым числом (за исключением пространства, занятого другими процессами)?

Или есть гарантия, чтобы поймать это, прежде чем он доберется до этого?

+1

Вы попадете в MemoryError –

+0

Итак, большая часть ОЗУ и файла подкачки будут перезаписаны? – mcu

+0

Зависит от того, что позволяет ОС, и запускается ли 'i' как ноль или нет. –

ответ

1

Вы можете проверить, что происходит, не рискуя заполнить всю доступную память. Вы могли бы set the memory limit explicitly:

#!/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 uses a continuous block of memory to store the digits, и поэтому вы можете получить ошибку, даже если имеется RAM, но фрагментировано.

Ваш конкретный код не должен вызывать его, но в целом вы также можете получить OverflowError if you try to construct an integer larger than sys.maxsize bytes.

+0

Итак, никакого пролития в файл подкачки нет, потому что он не будет непрерывным. – mcu

+0

@ coding4fun: python не заботится о том, откуда происходит память. Независимо от того, использует ли ОС файл подкачки или нет, он полностью прозрачен для python. Похоже, что алгоритм слишком медленный, чтобы заполнить память в любом случае. – jfs

Смежные вопросы