Est-ce une liste chaînée, un tableau? J'ai cherché partout et je n'ai trouvé que des gens qui devinaient. Mes connaissances en C ne sont pas assez bonnes pour regarder le code source.
183
Est-ce une liste chaînée, un tableau? J'ai cherché partout et je n'ai trouvé que des gens qui devinaient. Mes connaissances en C ne sont pas assez bonnes pour regarder le code source.
C'est un tableau dynamique . Preuve pratique: l'indexation prend (bien sûr avec des différences extrêmement faibles (0,0013 µsecs!)) Le même temps quel que soit l'indice:
...>python -m timeit --setup="x = [None]*1000" "x[500]"
10000000 loops, best of 3: 0.0579 usec per loop
...>python -m timeit --setup="x = [None]*1000" "x[0]"
10000000 loops, best of 3: 0.0566 usec per loop
Je serais étonné si IronPython ou Jython utilisaient des listes chaînées - elles ruineraient les performances de nombreuses bibliothèques largement utilisées construites sur l'hypothèse que les listes sont des tableaux dynamiques.
x=[None]*1000
, laissant la mesure de toute différence d'accès à la liste plutôt imprécise. Vous devez séparer l'initialisation:-s "x=[None]*100" "x[0]"
Le code C est assez simple, en fait. En développant une macro et en élaguant certains commentaires non pertinents, la structure de base est dans
listobject.h
, qui définit une liste comme:PyObject_HEAD
contient un nombre de références et un identificateur de type. Donc, c'est un vecteur / tableau qui surutilisent. Le code pour redimensionner un tel tableau lorsqu'il est plein est danslistobject.c
. Il ne double pas réellement le tableau, mais augmente en allouantà la capacité à chaque fois, où
newsize
est la taille demandée (pas nécessairementallocated + 1
parce que vous pouvezextend
par un nombre arbitraire d'éléments au lieu deappend
'inger un par un).Voir aussi la FAQ Python .
la source
array
module ou NumPy sont à privilégier.En CPython, les listes sont des tableaux de pointeurs. D'autres implémentations de Python peuvent choisir de les stocker de différentes manières.
la source
Cela dépend de l'implémentation, mais l'IIRC:
ArrayList
Ainsi, ils ont tous un accès aléatoire O (1).
la source
O(1)
indexation des listes est une hypothèse assez courante et valide, aucune implémentation n'oserait la casser.Je suggérerais l'article de Laurent Luce "Implémentation de liste Python" . Cela m'a vraiment été utile car l'auteur explique comment la liste est implémentée en CPython et utilise d'excellents diagrammes à cet effet.
...
...
...
...
la source
aggregation
, pascomposition
. J'aimerais qu'il y ait aussi une liste de composition.Selon la documentation ,
la source
Comme d'autres l'ont indiqué ci-dessus, les listes (lorsqu'elles sont sensiblement grandes) sont mises en œuvre en allouant une quantité fixe d'espace et, si cet espace doit se remplir, en allouant une plus grande quantité d'espace et en copiant les éléments.
Pour comprendre pourquoi la méthode est O (1) amortie, sans perte de généralité, supposons que nous ayons inséré a = 2 ^ n éléments, et nous devons maintenant doubler notre tableau à 2 ^ (n + 1). Cela signifie que nous faisons actuellement 2 ^ (n + 1) opérations. Dernière copie, nous avons fait 2 ^ n opérations. Avant cela, nous avons fait 2 ^ (n-1) ... jusqu'à 8,4,2,1. Maintenant, si nous additionnons ces derniers, nous obtenons 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) insertions totales (c'est-à-dire O (1) temps amorti). De plus, il convient de noter que si la table permet les suppressions, la réduction de la table doit être effectuée à un facteur différent (par exemple 3x)
la source
Une liste en Python est quelque chose comme un tableau, dans lequel vous pouvez stocker plusieurs valeurs. La liste est modifiable, ce qui signifie que vous pouvez la modifier. La chose la plus importante que vous devez savoir, lorsque nous créons une liste, Python crée automatiquement un reference_id pour cette variable de liste. Si vous le modifiez en affectant d'autres variables, la liste principale sera modifiée. Essayons avec un exemple:
Nous ajoutons
my_list
mais notre liste principale a changé. La liste de ce moyen n'a pas été assignée comme une liste de copie assignée comme référence.la source
Dans CPython, la liste est implémentée en tant que tableau dynamique, et par conséquent, lorsque nous ajoutons à ce moment-là, non seulement une macro est ajoutée, mais un peu plus d'espace est alloué afin que chaque fois un nouvel espace ne soit pas ajouté.
la source