En Python, quelle taille un tableau ou une liste peut-il avoir? J'ai besoin d'un tableau d'environ 12 000 éléments. Est-ce que je pourrai toujours utiliser des méthodes tableau/liste telles que le tri, etc.?
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 pour être ((size_t) -1)>>1
Sur un système 32 bits classique, il s’agit du numéro (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 que vous avez est égal ou inférieur à celui-ci, toutes les fonctions de liste devraient fonctionner correctement.
Comme le dit le { la documentation Python } _:
sys.maxsize
Le plus grand nombre entier positif pris en charge par le type Py_ssize_t de la plate-forme, et donc les listes de taille maximale, les chaînes, les dicts et de nombreux autres conteneurs.
Sur mon ordinateur (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
Sûr que c'est OK. En fait, vous pouvez voir par vous-même facilement:
l = range(12000)
l = sorted(l, reverse=True)
Courir les 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 le code occasionnel, j'ai créé des listes avec des millions d'éléments. Je pense que l'implémentation de listes par Python est uniquement liée à la quantité de mémoire disponible sur votre système.
De plus, les méthodes/fonctions de la liste devraient continuer à fonctionner malgré la taille de la liste.
Si vous vous souciez de la performance, il pourrait être intéressant de consulter une bibliothèque telle que NumPy .
12 000 éléments n’est rien en Python ... et en réalité, le nombre d’éléments peut aller aussi loin que la mémoire de l’interprète Python sur votre système.
Les caractéristiques de performance des listes sont décrites dans Effbot.
Les listes Python sont réellement implémentées en tant que vecteur pour un accès aléatoire rapide. Le conteneur contiendra donc autant d'éléments qu'il y a d'espace en mémoire. (Vous avez besoin d'espace pour les pointeurs contenus dans la liste, ainsi que d'un espace en mémoire pour le ou les objets pointés.)
L’ajout de O(1)
(complexité constante amortie) est ajouté; toutefois, l’insertion/la suppression à partir du milieu de la séquence nécessitera une réorganisation de O(n)
(complexité linéaire) qui ralentira avec le nombre d’éléments de 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 simplement le temps nécessaire pour échanger tous les pointeurs de la liste (nécessairement O(n)
(complexité linéaire), car vous touchez chaque pointeur une fois).
Je dirais que vous n'êtes limité que par la quantité totale de RAM disponible. Évidemment, plus le tableau est grand, plus les opérations seront longues.
Cela varie selon les systèmes (dépend de la RAM). La meilleure façon de le savoir est
import six
six.MAXSIZE
9223372036854775807
Ceci donne également la taille maximale de list
et dict
, comme indiqué dans documentation