Quel est le coût de la len()
fonction des modules intégrés Python? (liste / tuple / chaîne / dictionnaire)
290
Quel est le coût de la len()
fonction des modules intégrés Python? (liste / tuple / chaîne / dictionnaire)
C'est O (1) (temps constant, ne dépendant pas de la longueur réelle de l'élément - très rapide) sur chaque type que vous avez mentionné, plus set
et d'autres tels que array.array
.
L'appel de len () sur ces types de données est O (1) dans CPython , l'implémentation la plus courante du langage Python. Voici un lien vers un tableau qui fournit la complexité algorithmique de nombreuses fonctions différentes dans CPython:
Page wiki TimeComplexity Python
la source
Tous ces objets gardent une trace de leur propre longueur. Le temps pour extraire la longueur est petit (O (1) en notation big-O) et consiste principalement en [description grossière, écrite en termes Python, pas en termes C]: recherchez "len" dans un dictionnaire et envoyez-le au Built_in len fonction qui recherchera la
__len__
méthode de l'objet et appellera cela ... tout ce qu'il a à faire estreturn self.length
la source
length
dans le dictionnaire pardir(list)
?list.lenght
variable illustrée est implémentée en C, pas en Python.Les mesures ci-dessous fournissent une preuve qui
len()
est O (1) pour les structures de données souvent utilisées.Une note concernant
timeit
: Lorsque l'-s
indicateur est utilisé et que deux chaînes sont passées àtimeit
la première chaîne, elle n'est exécutée qu'une seule fois et n'est pas chronométrée.Liste:
Tuple:
Chaîne:
Dictionnaire (dictionnaire-compréhension disponible en 2.7+):
Tableau:
Set (set-comprehension disponible en 2.7+):
Deque:
la source
len()
et j'ai également corrigé les mesures pour utiliser correctement l'-s
indicateur.python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
223 nsec par bouclepython -m timeit -s "l = range(100);" "len(l)"
66,2 nsec par bouclelen est un O (1) car dans votre RAM, les listes sont stockées sous forme de tables (série d'adresses contiguës). Pour savoir quand la table s'arrête, l'ordinateur a besoin de deux choses: la longueur et le point de départ. C'est pourquoi len () est un O (1), l'ordinateur stocke la valeur, il n'a donc qu'à la rechercher.
la source
J'ai pensé que len () en Python dépend de la taille de la liste, donc je stocke toujours la longueur dans une variable si j'utilise plusieurs fois. Mais aujourd'hui, lors du débogage, j'ai remarqué l'attribut __len__ dans l'objet liste, donc len () doit simplement le récupérer, ce qui rend la complexité O (1). Je viens donc de googler si quelqu'un l'a déjà demandé et est tombé sur ce post.
la source
__len__
c'est une fonction, pas une variable qui représente la longueur d'une liste.list.__len__
fonction s'exécute en temps constant? C'est le cas, mais pas seulement parce que c'est une fonction. Parce qu'il a mis en œuvre comme ça.