Quanto può diventare grande un elenco Python?


119

In Python, quanto può essere grande una lista? Ho bisogno di un elenco di circa 12000 elementi. Potrò ancora eseguire metodi di elenco come l'ordinamento, ecc.?

Risposte:


193

Secondo il codice sorgente , la dimensione massima di un elenco è PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXè definito in pyport.h come essere((size_t) -1)>>1

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

Pertanto la dimensione massima di un elenco Python su un sistema a 32 bit è 536.870.912 elementi.

Finché il numero di elementi che hai è uguale o inferiore a questo, tutte le funzioni della lista dovrebbero funzionare correttamente.


4
Perché lo è sizeof(PyObject*) == 4?? Cosa rappresenta questo?
Matt

4
@Matt, è il numero di byte di un singolo PyObject *. Quella cosa è un cosiddetto puntatore (li riconosci a causa dell'asterisco alla fine). I puntatori sono lunghi 4 byte e memorizzano un indirizzo di memoria nell'oggetto allocato. Sono lunghi "solo" 4 byte perché con 4 byte puoi indirizzare ogni elemento nella memoria dei computer di oggi.
Antonio Ragagnin

1
Vale la pena notare (come indica la risposta di Álvaro Justen) che su altre macchine, in particolare quelle che eseguono sistemi a 64 bit, il valore di PY_SSIZE_T_MAXcan è molto grande.
ClydeTheGhost

@ClydeTheGhost, potresti specificare se anche quelli che eseguono sistemi a 64 bit possono avere una dimensione massima inferiore rispetto ai 536.870.912 elementi? O che possono variare notevolmente, ma avere sempre una dimensione massima uguale o superiore a 536.870.912 elementi?
al

1
@at Il massimo per un sistema a 64 bit sarà sempre uguale o maggiore di quello per un sistema a 32 bit.
ClydeTheGhost

71

Come dice la documentazione di Python :

sys.maxsize

Il numero intero positivo più grande supportato dal tipo Py_ssize_t della piattaforma e quindi la dimensione massima consentita per elenchi, stringhe, dict e molti altri contenitori.

Nel mio computer (Linux x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807

come risponde alla domanda
ldgorman

11
@ldgorman, sys.maxsizeè la risposta alla domanda. Architetture differenti supportano massimi differenti.
Simon Kuang

2
9223372036854775807 elementi? Veramente? Anche questo varia notevolmente dalla risposta più votata.
akki

13
@akki la risposta accettata si riferisce a un sistema a 32 bit. Dato che è il 2016, presumo che tu sia su un sistema a 64 bit e la risposta sia quindi corretta
Brian Leach

2
Questa dovrebbe essere la risposta selezionata.
Lokesh

26

Certo che va bene. In realtà puoi vedere di persona facilmente:

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

L'esecuzione di quelle linee sulla mia macchina ha richiesto:

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

Ma certo come hanno detto tutti gli altri. Più grande è l'array, più lente saranno le operazioni.


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

5
@dF, hai ragione sulla precisione. Grazie per averlo notato. Volevo solo dimostrare un punto. E l'esempio lo dimostra.
Nadia Alramli

13
@dF: fantastico! 0.024s era troppo lungo per me e sono contento di poter smettere di preoccuparmene ora.
Thomas Edleson

6

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

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

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


5

Le caratteristiche delle prestazioni per gli elenchi sono descritte su Effbot.

Gli elenchi Python sono effettivamente implementati come vettori per un accesso casuale veloce, quindi il contenitore in pratica conterrà tanti elementi quanti è lo spazio disponibile in memoria. (Hai bisogno di spazio per i puntatori contenuti nell'elenco e di spazio in memoria per gli oggetti a cui punta).

L'aggiunta di is O(1)(complessità costante ammortizzata), tuttavia, l'inserimento / l'eliminazione dal centro della sequenza richiederà un O(n)riordino (complessità lineare), che diventerà più lento con il numero di elementi nell'elenco.

La tua 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 del tipo di dati dell'elenco di Python .

L'inversione richiede solo la quantità di tempo necessaria per scambiare tutti i puntatori nell'elenco (necessariamente O(n)(complessità lineare), poiché si tocca ogni puntatore una volta).


4

12000 elementi non sono niente in Python ... e in realtà il numero di elementi può arrivare fino a quando l'interprete Python ha memoria sul tuo sistema.


3

Varia a seconda dei sistemi (dipende dalla RAM). Il modo più semplice per scoprirlo è

import six six.MAXSIZE 9223372036854775807 Questo dà la dimensione massima di liste dictanche, come da documentazione


1
questa non è la documentazione
Boris il

1

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


4
Generalmente vero, ma non tutti - l'aggiunta rimane ammortizzata a tempo costante indipendentemente dalla dimensione dell'array.
cdleary

0

Ho ottenuto questo da qui su un sistema x64 bit: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 maggio 2018, 01:54:01) [MSC v.1913 64 bit (AMD64)] su win32

inserisci qui la descrizione dell'immagine


1
Questa sarebbe un'ottima risposta se espandessi un po 'i dettagli e come gli altri potrebbero trovare il proprio limite.
Shayaan

-16

Non ci sono limiti al numero di elenco. Il motivo principale che causa il tuo errore è la RAM. Aggiorna la dimensione della memoria.


9
-1 perché in realtà non risponde alla domanda ed è effettivamente fuorviante perché (come mostrato da altre risposte) l'elenco ha effettivamente una dimensione massima.
ClydeTheGhost
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.