Python - Медленно ли словарь находит частоту каждого символа? - PullRequest
24 голосов
/ 26 марта 2010

Я пытаюсь найти частоту каждого символа в любом данном тексте, используя алгоритм сложности O (n). Мой алгоритм выглядит так:

s = len(text) 
P = 1.0/s 
freqs = {} 
for char in text: 
    try: 
       freqs[char]+=P 
    except: 
       freqs[char]=P 

но я сомневаюсь, что этот словарь-метод достаточно быстр, потому что он зависит от базовой реализации методов словаря. Это самый быстрый метод?

ОБНОВЛЕНИЕ: нет увеличения скорости, если используются коллекции и целые числа. Это потому, что алгоритм уже имеет сложность O (n), поэтому существенное ускорение невозможно.

Например, результаты для 1 МБ текста:

without collections:
real    0m0.695s

with collections:
real    0m0.625s

Ответы [ 12 ]

1 голос
/ 26 марта 2010

Небольшое ускорение будет при использовании метода dict.setdefault, таким образом, вы не будете платить довольно большую цену за каждого нового персонажа:

for char in text:
    freq[char] = freq.setdefault(char, 0.0) + P

Как замечание: обнаженная except: считается очень плохой практикой.

1 голос
/ 26 марта 2010

Чтобы избежать попытки, кроме накладных расходов, вы можете использовать defaultdict.

...