Existe-t-il une différence de performances entre les tuples et les listes en ce qui concerne l'instanciation et la récupération d'éléments?
python
performance
list
tuples
python-internals
Lecture seulement
la source
la source
Réponses:
Le
dis
module désassemble le code d'octet d'une fonction et est utile pour voir la différence entre les tuples et les listes.Dans ce cas, vous pouvez voir que l'accès à un élément génère un code identique, mais que l'attribution d'un tuple est beaucoup plus rapide que l'attribution d'une liste.
la source
ListLike
avec un__getitem__
qui fait quelque chose d'horriblement lent, puis démontez-lex = ListLike((1, 2, 3, 4, 5)); y = x[2]
. Le bytecode ressemblera plus à l'exemple de tuple ci-dessus qu'à l'exemple de liste, mais croyez-vous vraiment que les performances seront similaires?En général, vous pouvez vous attendre à ce que les tuples soient légèrement plus rapides. Cependant, vous devez absolument tester votre cas spécifique (si la différence peut avoir un impact sur les performances de votre programme - n'oubliez pas que "l'optimisation prématurée est la racine de tout mal").
Python rend cela très facile: Timeit est votre ami.
et...
Donc, dans ce cas, l'instanciation est presque un ordre de grandeur plus rapide pour le tuple, mais l'accès aux éléments est en fait un peu plus rapide pour la liste! Donc, si vous créez quelques tuples et y accédez plusieurs fois, il peut être plus rapide d'utiliser des listes à la place.
Bien sûr, si vous souhaitez modifier un élément, la liste sera certainement plus rapide car vous devrez créer un tout nouveau tuple pour en modifier un élément (car les tuples sont immuables).
la source
python -m timeit "x=tuple(xrange(999999))"
vspython -m timeit "x=list(xrange(999999))"
. Comme on pouvait s'y attendre, il faut un peu plus de temps pour matérialiser un tuple qu'une liste.-s "SETUP_CODE"
est exécuté avant le code temporisé réel.Résumé
Les tuples ont tendance à mieux performer que les listes dans presque toutes les catégories:
1) Les tuples peuvent être pliés en permanence .
2) Les tuples peuvent être réutilisés au lieu d'être copiés.
3) Les tuples sont compacts et n'allouent pas trop.
4) Les tuples font directement référence à leurs éléments.
Les tuples peuvent être pliés en permanence
Des tuples de constantes peuvent être précalculés par l'optimiseur de judas de Python ou l'optimiseur AST. Les listes, en revanche, se construisent à partir de zéro:
Les tuples n'ont pas besoin d'être copiés
La course
tuple(some_tuple)
revient immédiatement. Les tuples étant immuables, ils ne doivent pas être copiés:En revanche,
list(some_list)
nécessite que toutes les données soient copiées dans une nouvelle liste:Les tuples ne surallouent pas
Étant donné que la taille d'un tuple est fixe, il peut être stocké de manière plus compacte que les listes qui doivent être surallouées pour rendre les opérations append () efficaces.
Cela donne aux tuples un bel avantage d'espace:
Voici le commentaire d' Objects / listobject.c qui explique ce que font les listes:
Les tuples se réfèrent directement à leurs éléments
Les références aux objets sont incorporées directement dans un objet tuple. En revanche, les listes ont une couche supplémentaire d'indirection vers un tableau externe de pointeurs.
Cela donne aux tuples un petit avantage de vitesse pour les recherches indexées et le déballage:
Voici comment le tuple
(10, 20)
est stocké:Voici comment la liste
[10, 20]
est stockée:Notez que l'objet tuple incorpore directement les deux pointeurs de données tandis que l'objet liste possède une couche supplémentaire d'indirection vers un tableau externe contenant les deux pointeurs de données.
la source
Internally, tuples are stored a little more efficiently than lists, and also tuples can be accessed slightly faster.
Comment pourriez-vous alors expliquer les résultats de la réponse de dF.?tuple(some_tuple)
ne se retourne quesome_tuple
s'ilsome_tuple
est lavable - lorsque son contenu est récursivement immuable et lavable. Sinon,tuple(some_tuple)
renvoie un nouveau tuple. Par exemple, lorsqu'ilsome_tuple
contient des éléments modifiables.Les tuples, étant immuables, sont plus efficaces en mémoire; répertorie, pour plus d'efficacité, la surutilisation de la mémoire afin de permettre des ajouts sans constante
realloc
s. Donc, si vous voulez parcourir une séquence constante de valeurs dans votre code (par exemplefor direction in 'up', 'right', 'down', 'left':
), les tuples sont préférés, car ces tuples sont pré-calculés au moment de la compilation.Les vitesses d'accès doivent être les mêmes (elles sont toutes deux stockées en tant que tableaux contigus dans la mémoire).
Mais,
alist.append(item)
est de loin préférableatuple+= (item,)
lorsque vous traitez des données mutables. N'oubliez pas que les tuples sont destinés à être traités comme des enregistrements sans nom de champ.la source
Vous devriez également considérer le
array
module dans la bibliothèque standard si tous les éléments de votre liste ou tuple sont du même type C. Cela prendra moins de mémoire et peut être plus rapide.la source
Voici une autre petite référence, juste pour le plaisir ..
Faisons la moyenne de ces derniers:
Vous pouvez l'appeler presque non concluant.
Mais bien sûr, les tuples ont pris
101.239%
du temps, ou1.239%
du temps supplémentaire pour faire le travail par rapport aux listes.la source
Les tuples devraient être légèrement plus efficaces et à cause de cela, plus rapides, que les listes car ils sont immuables.
la source
La principale raison pour laquelle Tuple est très efficace en lecture est qu'il est immuable.
Pourquoi les objets immuables sont-ils faciles à lire?
La raison est que les tuples peuvent être stockés dans le cache mémoire, contrairement aux listes. Le programme lit toujours à partir de l'emplacement de la mémoire des listes car il est modifiable (peut changer à tout moment).
la source