2015-09-20 23 views
5

Gli interi Python 3 hanno unlimited precision. In pratica, questo è limitato dalla memoria del computer.Python Infinite Integers

Si consideri il codice followng:

i = 12345 
while True: 
    i = i * 123 

Ciò, ovviamente, fallire. Ma quale sarà il risultato di questo? L'intera RAM (e il file di paging) sono riempiti con questo intero (tranne lo spazio occupato da altri processi)?

Oppure c'è una protezione per prendere questo prima che arrivi così lontano?

+1

Si verificherà un errore MemoryError –

+0

Quindi, la maggior parte della RAM e del file di paging verrà sovrascritta? – mcu

+0

Dipende da ciò che il sistema operativo consente, e se 'i' iniziato come zero o no. –

risposta

1

È possibile verificare cosa succede senza rischiare di riempire tutta la memoria disponibile. Si potrebbe 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 

Questo codice consuma 100% della CPU (su un singolo core) e la memoria consumata cresce molto molto lentamente.

In linea di principio, è necessario ottenere MemoryError a un certo punto, se ciò accade prima che il computer non sia diventato chiaro. CPython uses a continuous block of memory to store the digits e quindi potresti ricevere l'errore anche se c'è una RAM disponibile ma frammentata.

Il codice specifico non deve attivarlo, ma in generale è possibile anche ottenere OverflowError if you try to construct an integer larger than sys.maxsize bytes.

+0

Quindi, niente spargimento nel file di paging allora, perché non sarebbe continuo. – mcu

+0

@ coding4fun: python non si cura di dove viene la memoria. Se il sistema operativo utilizza il file di paging o no è completamente trasparente per Python. Sembra che l'algoritmo sia troppo lento per riempire comunque la memoria. – jfs