En Python, quelle taille peut atteindre une liste? J'ai besoin d'une liste d'environ 12 000 éléments. Est-ce que je pourrai toujours exécuter des méthodes de liste telles que le tri, etc.?
119
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.
sizeof(PyObject*) == 4?
? Qu'est-ce que cela représente?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
Sur mon ordinateur (Linux x86_64):
la source
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'exécution de ces lignes sur ma machine a pris:
Mais bien sûr, comme tout le monde l'a dit. Plus le tableau est grand, plus les opérations seront lentes.
la source
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 .
la source
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 uneO(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).la source
12000 éléments ne sont rien en Python ... et en fait le nombre d'éléments peut aller aussi loin que l'interpréteur Python a de la mémoire sur votre système.
la source
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 delist
etdict
aussi, selon la documentationla source
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.
la source
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
la source
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.
la source