2010-01-24 5 views
3

Existe-t-il un moyen plus rapide de faire ce qui suit pour des dicts beaucoup plus gros?Recherche d'alias rapides par défaut en Python

aliases = { 
      'United States': 'USA', 
      'United Kingdom': 'UK', 
      'Russia': 'RUS', 
      } 
if countryname in aliases: countryname = aliases[countryname] 
+0

Les grands dicts sont rapides. –

Répondre

6

Votre solution est correcte, car "in" vaut 0 (1) pour les dictionnaires.

Vous pourriez faire quelque chose comme ça pour économiser quelques:

countryname = aliases.get(countryname, countryname) 

(mais je trouve votre code beaucoup plus facile à lire que)

En ce qui concerne la vitesse, quelle est la meilleure solution dépendrait de si il y aura une majorité de "hits" ou "misses". Mais ce serait probablement dans la gamme des nanosecondes quand il s'agit de la différence.

+0

Élevé à cause de la partie notant la vitesse dépend du nombre de coups ou de ratés – Mark

1

Accès à .get pourrait être plus rapide que la vérification et l'affectation dans la variable

aliases.get(countryname) 

Et si countryname est existe pas dans les alias elle retournera None.

+1

'.get()' peut recevoir un argument par défaut, donc 'aliases.get (nom du pays, nom du pays)' fera l'affaire concernant le problème "va retourner Aucun". – balpha

+0

bonne idée, merci pour le suivi. – YOU

2

Si votre liste tient dans la mémoire, les dicts sont le moyen le plus rapide. Comme Saint Marc souligne, vous faites deux où l'on lookups faire, que ce soit avec:

countryname = aliases.get(countryname, countryname) 

(qui laissera countryname inchangé si elle est pas dans le dictionnaire), ou:

try: 
    countryname = aliases[countryname] 
except KeyError: 
    pass 
0

Si votre dictionnaire est très volumineux et que vous vous attendez à ce que plusieurs de vos chèques ne trouvent pas de correspondance, vous pouvez envisager un Bloom filter ou un de ses dérivés et autoriser les faux positifs. Alternativement, parce que vos clés peuvent être triées (et/ou avoir des valeurs dérivées), vous pouvez implémenter un bisection ou un autre algorithme . Premièrement, je déterminerais exactement comment Python implémente les recherches dans les dictionnaires, donc vous n'allez pas seulement réinventer la roue.

En outre, une implémentation pure de Python pourrait être assez lente si elle implique beaucoup d'itérations. Considérez Cython, Numpy ou F2Py pour être vraiment optimisé. (Si vous ne traitez que des noms de pays, je ne pense pas que vous ayez affaire à des mappages assez importants pour justifier mes suggestions), mais si vous envisagez d'effectuer une sorte de vérification orthographique, alors ..

Bonne chance.

Questions connexes