La façon la plus rapide de la suppression de certaines touches du dict en Python
Je suis à la recherche pour la plupart plus rapide/moyen efficace de supprimer certaines touches dans un python dict
Voici quelques options
for k in somedict.keys():
if k.startswith("someprefix"):
del somedict[k]
ou
dict((k, v) for (k, v) in somedict.iteritems() if not k.startswith('someprefix'))
Logiquement premier extrait devrait être plus rapide sur les petites dicts, il n'est pas de créer une copie d'un dict, mais crée une liste de toutes les clés, cependant double recherches et dict la reconstruction prend du temps. Tandis que la seconde est plus rapide sur les plus grandes dicts, mais nécessite 2x plus de mémoire.
J'ai vérifié mon hypothèse, dans un petit indice de référence.
Quelque chose de plus rapide?
- Non, vous ne pouvez pas. Vous ne pouvez pas ajouter ou supprimer des éléments à partir d'un dict vous êtes à parcourir.
- L'utilisation d'un trie. ___
- merci, supprimé le commentaire.
- Un cas particulier: si votre préfixes sont de taille fixe, de maintenir un dict de la liste des préfixes. Ensuite, c'est juste une suppression de toutes les clés dans une liste.
Vous devez vous connecter pour publier un commentaire.
Si le dict est assez grand, il peut être utile de générer un ensemble de nouvelles au lieu dict.
N'est pas seulement
del
plus facile à comprendre, mais il semble un peu plus rapide que pop():Edit: merci à Alex Martelli pour fournir des instructions sur la façon de faire de l'analyse comparative. J'espère que je n'ai pas glissé vers le haut de n'importe où.
D'abord mesurer le temps nécessaire pour copier:
De référence sur des copies de dict:
Soustrayant le coût de la copie, nous obtenons 1.872 usec pour
pop()
et 1.672 pourdel
.pop()
tout en étant plus lisible de l'OMI.timeit
: de ceux 1000000 boucles, 999999 exécuter plus d'un 1-entrée dict avecbar
comme la seule clé (la-s
code de programme d'installation n'est pas répété avant chaque boucle). Vous avez besoin de faire et de modifier und1=d.copy()
(avec cette déclaration comme une partie du code mesuré partimeit
) -- ce genre de chose est cruciale à tout moment, vous êtes en mesure de code qui modifie les données. Vous pouvez normaliser (afin de trouver le timing ratios) par l'ajout d'une telle copie à toutes les variantes que vous êtes timing, séparément de mesure uniquement lacopy
et en soustrayant de son temps de les timings des variantes de code qui vous intéresse.