Quelle peut être la taille d'une liste Python?

119

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.?

Dévoué
la source

Réponses:

193

Selon le code source , la taille maximale d'une liste est PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXest 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.

Inconnue
la source
4
Pourquoi sizeof(PyObject*) == 4?? Qu'est-ce que cela représente?
Matt
4
@Matt, est le nombre d'octets d'un seul 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.
Antonio Ragagnin
1
Il convient de noter (comme l'indique la réponse d'Álvaro Justen) que sur d'autres machines, notamment celles exécutant des systèmes 64 bits, la valeur de PY_SSIZE_T_MAXpeut très grandement.
ClydeTheGhost
@ClydeTheGhost, pourriez-vous spécifier si ceux qui exécutent des systèmes 64 bits peuvent également avoir une taille maximale inférieure à celle des 536 870 912 éléments? Ou qu'ils peuvent varier considérablement, tout en ayant toujours une taille maximale égale ou supérieure à 536 870 912 éléments?
à
1
@at Le maximum pour un système 64 bits sera toujours égal ou supérieur à celui d'un système 32 bits.
ClydeTheGhost
71

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
Álvaro Justen
la source
comment cela répond-il à la question
ldgorman
11
@ldgorman, sys.maxsizeest la réponse à la question. Différentes architectures prennent en charge différents maxima.
Simon Kuang
2
9223372036854775807 éléments? Vraiment? Cela varie également considérablement de la réponse la plus votée.
akki
13
@akki la réponse acceptée fait référence à un système 32 bits. Puisque nous sommes en 2016, je suppose que vous êtes sur un système 64 bits et que la réponse est donc correcte
Brian Leach
2
Cela devrait être une réponse sélectionnée.
Lokesh
26

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.

Nadia Alramli
la source
20
Le timing de cette façon peut être trompeur - la plupart du temps est passé à démarrer l'interpréteur Python. Un meilleur moyen est: python -m timeit.py "l = range (12000); l = sorted (l, reverse = True)". Sur ma machine, cela donne environ 1 / 20e du temps pour cet exemple.
dF.
5
@dF, vous avez raison sur l'exactitude. Merci d'avoir noté cela. Je voulais juste prouver un point. Et l'exemple le prouve.
Nadia Alramli
13
@dF: Génial! 0.024s était beaucoup trop long pour moi et je suis heureux de pouvoir arrêter de m'inquiéter à ce sujet maintenant.
Thomas Edleson
6

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 .

Doug
la source
5

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).

cdleary
la source
4

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.

AlbertoPL
la source
3

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 listet dictaussi, selon la documentation

yunus
la source
1
ce n'est pas la documentation
Boris le
1

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.

Wayne Koorts
la source
4
Généralement vrai, mais pas tous - l'ajout reste amorti à temps constant indépendamment de la taille du tableau.
cdleary
0

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

entrez la description de l'image ici

user2063329
la source
1
Ce serait une excellente réponse si vous développiez un peu les détails et comment les autres pourraient trouver leur propre limite.
Shayaan
-16

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.

Haimei
la source
9
-1 car elle ne répond pas réellement à la question, et est en fait trompeuse car (comme le montrent d'autres réponses) la liste a en effet une taille maximale.
ClydeTheGhost