le comptage en double des mots en python le moyen le plus rapide
J'essayais de compter en double les mots-dessus une liste de 230 mille mots.J'ai utilisé python, dictionnaire de le faire. Le code est donné ci-dessous:
for words in word_list:
if words in word_dict.keys():
word_dict[words] += 1
else:
word_dict[words] = 1
Le code ci-dessus a pris 3 minutes!. J'ai couru le même code, plus de 1,5 millions de mots, et il était en marche pendant plus de 25 minutes et j'ai perdu ma patience et de la fin. Ensuite, j'ai trouvé que je peux utiliser le code suivant à partir ici (voir également ci-dessous). Le résultat était tellement surprenante, elle a complété en quelques secondes!. Donc ma question est quel est le moyen plus rapide de faire cette opération?. Je suppose que le dictionnaire processus de création doit être prise de O(N) fois. Comment était la Contre la méthode de mesure de terminer ce processus en quelques secondes et créer une exacte dans le dictionnaire de mot-clé et la fréquence comme c'est la valeur?
from collections import Counter
word_dict = Counter(word_list)
word_dict.keys()
obtient toutes les clés dans une liste, et la vérification de l'appartenance à une liste est une O(n)
opération, lors de la vérification de l'appartenance à une table de hachage est beaucoup plus rapide.Code pour
collections.Counter
est disponible hg.python.org/cpython/file/2.7/Lib/collections.pyconnexes: Python Est un dictionnaire lent à trouver la fréquence de chaque caractère?
OriginalL'auteur Rkz | 2013-01-17
Vous devez vous connecter pour publier un commentaire.
C'est à cause de cela:
.keys()
renvoie une liste de toutes les clés. Les listes de prendre le temps linéaire de balayage, de sorte que votre programme était en cours d'exécution dans quadratique du temps!Essayez plutôt ceci:
Aussi, si vous êtes intéressé, vous pouvez voir l'
Compteur
de la mise en œuvre pour vous-même. Il écrit régulièrement Python.Sur Python 3 Compteur peut utiliser
_count_elements()
helper écrit en COriginalL'auteur Eevee
votre dictionnaire méthode de comptage n'est pas bien construit.
vous pourriez avoir utilisé un
defaultdict
de la manière suivante:mais la
compteur
méthode de itertools est encore plus rapide, même si elle est en train de faire presque la même chose, parce que c'est écrit dans une application plus efficace. cependant, avec le compteur méthode, vous devez transmettre une liste à compter, tandis que l'utilisation d'un defaultdict, vous pouvez mettre les sources à partir d'endroits différents et ont une plus compliqué boucle.en fin de compte c'est votre préférence. si le comptage d'une liste,
counter
est le chemin à parcourir, si l'itération à partir de sources multiples, ou vous voulez simplement un compteur dans votre programme et ne veux pas l'extra de recherche pour vérifier si un élément est déjà prise en compte ou pas. puisdefaultdict
est votre choix.Merci très instructif en effet.
OriginalL'auteur Inbar Rose
Fait vous pouvez regarder le code Compteur, voici la mise à jour de la méthode qui est appelée sur init:
(Avis il utilise la performance truc de la définition d'une définition locale de
self.get
)OriginalL'auteur monkut
Vous pouvez également essayer d'utiliser
defaultdict
plus concurrentiel choix. Essayez:OriginalL'auteur Thorsten Kranz