Réponses:
Selon le code source , la taille maximale d'une liste est PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
est défini dans pyport.h comme étant((size_t) -1)>>1
Sur un système 32 bits standard, il s'agit de (4294967295/2) / 4 ou 536870912.
Par conséquent, la taille maximale d'une liste python sur un système 32 bits est de 536 870 912 éléments.
Tant que le nombre d'éléments dont vous disposez est égal ou inférieur à celui-ci, toutes les fonctions de liste doivent fonctionner correctement.
PyObject *
. Cette chose est un soi-disant pointeur (vous les reconnaissez à cause de l'astérisque à la fin). Les pointeurs ont une longueur de 4 octets et stockent une adresse mémoire sur l'objet alloué. Ils ne font «que» 4 octets car avec 4 octets vous pouvez adresser chaque élément dans une mémoire des ordinateurs actuels.
PY_SSIZE_T_MAX
peut très grandement.
Comme le dit la documentation Python :
sys.maxsize
Le plus grand entier positif pris en charge par le type Py_ssize_t de la plate-forme, et donc la taille maximale que peuvent avoir les listes, les chaînes, les dictionnaires et de nombreux autres conteneurs.
Sur mon ordinateur (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
sys.maxsize
est la réponse à la question. Différentes architectures prennent en charge différents maxima.
Bien sûr que ça va. En fait, vous pouvez facilement voir par vous-même:
l = range(12000)
l = sorted(l, reverse=True)
L'exécution de ces lignes sur ma machine a pris:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Mais bien sûr, comme tout le monde l'a dit. Plus le tableau est grand, plus les opérations seront lentes.
Dans du code occasionnel, j'ai créé des listes avec des millions d'éléments. Je pense que l'implémentation des listes par Python n'est liée que par la quantité de mémoire sur votre système.
De plus, les méthodes / fonctions de liste devraient continuer à fonctionner malgré la taille de la liste.
Si vous vous souciez des performances, il peut être intéressant de se pencher sur une bibliothèque telle que NumPy .
Les caractéristiques de performance des listes sont décrites sur Effbot.
Les listes Python sont en fait implémentées en tant que vecteur pour un accès aléatoire rapide, de sorte que le conteneur contiendra essentiellement autant d'éléments qu'il y a d'espace pour la mémoire. (Vous avez besoin d'espace pour les pointeurs contenus dans la liste ainsi que d'espace en mémoire pour les objets pointés.)
L'ajout est O(1)
(complexité constante amortie), cependant, l'insertion dans / la suppression à partir du milieu de la séquence nécessitera une O(n)
réorganisation (de complexité linéaire), qui deviendra plus lente que le nombre d'éléments dans votre liste.
Votre question de tri est plus nuancée, car l'opération de comparaison peut prendre un temps illimité. Si vous effectuez des comparaisons très lentes, cela prendra beaucoup de temps, même si ce n'est pas la faute du type de données de liste de Python .
L'inversion prend juste le temps nécessaire pour permuter tous les pointeurs de la liste (nécessairement O(n)
(complexité linéaire), puisque vous touchez chaque pointeur une fois).
Cela varie selon les systèmes (dépend de la RAM). Le moyen le plus simple de le savoir est
import six
six.MAXSIZE
9223372036854775807
Cela donne la taille maximale de list
et dict
aussi, selon la documentation
Je dirais que vous n'êtes limité que par la quantité totale de RAM disponible. De toute évidence, plus la matrice est grande, plus les opérations seront longues.
J'ai obtenu ceci à partir d'ici sur un système x64 bits: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 mai 2018, 01:54:01) [MSC v.1913 64 bits (AMD64)] sur win32
Il n'y a pas de limitation du numéro de liste. La principale raison de votre erreur est la RAM. Veuillez mettre à jour la taille de votre mémoire.
sizeof(PyObject*) == 4?
? Qu'est-ce que cela représente?