Risposte:
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.
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.
PY_SSIZE_T_MAX
can è molto grande.
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
sys.maxsize
è la risposta alla domanda. Architetture differenti supportano massimi differenti.
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.
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 .
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).
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 list
e dict
anche, come da documentazione
Direi che sei limitato solo dalla quantità totale di RAM disponibile. Ovviamente più grande è l'array, più lunghe saranno le operazioni su di esso.
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
Non ci sono limiti al numero di elenco. Il motivo principale che causa il tuo errore è la RAM. Aggiorna la dimensione della memoria.
sizeof(PyObject*) == 4?
? Cosa rappresenta questo?