web-dev-qa-db-fra.com

Les clés du dictionnaire Python. "En" complexité

Question rapide pour satisfaire principalement ma curiosité sur le sujet. 

J'écris de gros programmes python avec un système de base de données SQlite et traiterai un grand nombre d'enregistrements à l'avenir. Je dois donc optimiser autant que possible. 

Pour quelques fonctions, je cherche des clés dans un dictionnaire. J'utilisais le mot clé "in" pour le prototypage et prévoyais de revenir et d'optimiser ces recherches ultérieurement, car je sais que le mot clé "in" est généralement O(n) (car cela ne se traduit que par python itérant sur une toute la liste et en comparant chaque élément). Mais, comme un dict python est fondamentalement juste une carte de hachage, l’interprète python est-il assez intelligent pour interpréter:

if(key in dict.keys()):
    ...code...

à:

if(dict[key] != None):
    ...code...

C'est fondamentalement la même opération mais le haut serait O(n) et le bas serait O (1). 

Il est facile pour moi d’utiliser la version inférieure de mon code, mais j’étais alors curieux et je pensais pouvoir le demander. 

35
tknickman

Dans Python 2, dict.keys() crée d'abord la liste complète des clés. C’est pourquoi il s’agit d’une opération O(N), alors que key in dict est une opération O(1).

if(dict[key] != None) lèvera KeyError si la clé n'est pas trouvée dans le dict, elle n'est donc pas équivalente au premier code.

Python 2 résultats:

>>> dic = dict.fromkeys(range(10**5))
>>> %timeit 10000 in dic
1000000 loops, best of 3: 170 ns per loop
>>> %timeit 10000 in dic.keys()
100 loops, best of 3: 4.98 ms per loop
>>> %timeit 10000 in dic.iterkeys()
1000 loops, best of 3: 402 us per loop
>>> %timeit 10000 in dic.viewkeys()
1000000 loops, best of 3: 457 ns per loop

En Python 3, dict.keys() renvoie un objet de vue qui est bien plus rapide que le keys() de Python 2, mais toujours plus lent et normal key in dict:

Résultats Python 3:

>>> dic = dict.fromkeys(range(10**5))
>>> %timeit 10000 in dic
1000000 loops, best of 3: 295 ns per loop
>>> %timeit 10000 in dic.keys()
1000000 loops, best of 3: 475 ns per loop

Utilisez juste:

if key in dict:
   #code
9
Ashwini Chaudhary

La bonne façon de faire cela serait

if key in dict:
    do stuff

l'opérateur in est O(1) pour les dictionnaires et les ensembles en python.

6
Matt Bryant

L'opérateur in for dict a une complexité de cas moyenne de O (1). Pour des informations détaillées sur la complexité temporelle des autres méthodes dict (), visitez ce lien link .

0
prafi