2009-05-12 15 views

risposta

149

In base allo source code, la dimensione massima di un elenco è PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAX è definita pyport.h essere ((size_t) -1)>>1

In un sistema a 32 bit regolare, questo è (4294967295/2)/4 o 536870912.

Pertanto, la dimensione massima di un elenco pitone su un po '32 sistema è 536,870,912 elementi.

Fintantoché il numero di elementi presenti è uguale o inferiore a questo, tutte le funzioni di elenco devono funzionare correttamente.

+2

Perché 'sizeof (PyObject *) == 4?'? Cosa rappresenta questo? – Matt

+3

@Matt, è il numero di byte di un singolo 'PyObject *'. Quella cosa è un cosiddetto puntatore (li riconosci a causa dell'esterix alla fine). I puntatori sono lunghi 4 byte e memorizzano un indirizzo di memoria sull'oggetto assegnato. Sono "solo" 4 byte perché con 4 byte è possibile indirizzare ogni elemento in una memoria dei computer attuali. –

+0

Vale la pena notare (come risposta di Álvaro Justen indica) che su altre macchine, in particolare quelli che utilizzano sistemi a 64 bit, il valore di 'PY_SSIZE_T_MAX' può molto notevolmente. –

4

12000 elementi non sono nulla in Python ... e in realtà il numero di elementi può arrivare fino all'interfaccia Python che ha memoria sul sistema.

1

Direi che sei limitato solo dalla quantità totale di RAM disponibile. Ovviamente più grande è l'array, più saranno necessarie le operazioni più lunghe.

+3

Generalmente vero, ma non tutti - l'accodamento rimane ammortizzato a tempo costante indipendentemente dalla dimensione dell'array. – cdleary

+0

Interessante, grazie per il commento. –

24

Sicuro, è OK. In realtà si può vedere di persona facilmente:

l = range(12000) 
l = sorted(l, reverse=True) 

Esecuzione dei quelle linee sulla mia macchina ha avuto:

real 0m0.036s 
user 0m0.024s 
sys 0m0.004s 

Ma sicuro come tutti gli altri ha detto. Più grande è l'array, più lenti saranno le operazioni.

+15

Il tempismo in questo modo può essere fuorviante - la maggior parte del tempo è dedicato all'avvio dell'interprete Python. Un modo migliore è: python -m timeit.py "l = range (12000); l = sorted (l, reverse = True)". Sulla mia macchina questo dà circa 1/20 del tempo per questo esempio. –

+3

@dF, hai ragione riguardo alla precisione. Grazie per averlo notato Volevo solo dimostrare un punto. E l'esempio lo dimostra. –

+8

@dF: Fantastico! 0.024s era troppo lungo per me e sono contento di poter smettere di preoccuparmene ora. –

6

In codice casuale ho creato elenchi con milioni di elementi. Credo che l'implementazione di liste di Python sia vincolata solo dalla quantità di memoria sul tuo sistema.

Inoltre, i metodi elenco/funzioni dovrebbero continuare a funzionare nonostante le dimensioni dell'elenco.

Se ti interessano le prestazioni, potrebbe essere utile esaminare una libreria come NumPy.

5

Performance characteristics for lists sono descritti su Effbot.

Gli elenchi di Python sono in realtà implementati come vettore per l'accesso casuale rapido, quindi il contenitore in pratica contiene tutti gli elementi quanti sono gli spazi in memoria. (È necessario spazio per i puntatori contenuti nell'elenco e lo spazio in memoria per gli oggetti puntati.)

L'aggiunta è O(1) (complessità costante ammortizzata), tuttavia, inserendo/eliminando dal centro di la sequenza richiederà un riordino O(n) (complessità lineare), che diventerà più lento del numero di elementi nell'elenco.

La domanda di ordinamento è più sfumata, poiché l'operazione di confronto può richiedere una quantità di tempo illimitata. Se stai eseguendo confronti molto lenti, ci vorrà molto tempo, anche se non è colpa di Python's list data type.

L'inversione impiega solo il tempo necessario per scambiare tutti i puntatori nell'elenco (necessariamente O(n) (complessità lineare), poiché si tocca ogni puntatore una volta).

31

Come Python documentation says:

sys.maxsize

Il grande numero intero positivo supportato dal tipo Py_ssize_t della piattaforma, e quindi le liste dimensione massima, stringhe, dicts, e molti altri contenitori possono avere.

in Risorse del computer (Linux x86_64):

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

come risponde alla domanda – ldgorman

+3

@ ldgorman, 'sys.maxsize' è la risposta alla domanda. Diverse architetture supportano diversi massimi. –

+0

Il valore restituito da sys.maxsize riflette in qualche modo la quantità di RAM disponibile nel computer? – GeoJohn

-8

Non v'è alcuna limitazione di numero dell'elenco. Il motivo principale che causa il tuo errore è la RAM. Si prega di aggiornare la dimensione della memoria.

+1

-1, perché in realtà non rispondere alla domanda, e in realtà è fuorviante, perché (come mostrato da altre risposte) Lista ha effettivamente un taglia massima. –

Problemi correlati