@ ThatGuy сделал исправление, но на самом деле не сказал вам этого:
Основной причиной вашего замедления является линия
if word in hash.keys():
, который кропотливо составляет список всех ключей, а затем кропотливо ищет в этом списке слово. Требуемое время пропорционально количеству ключей, то есть количеству найденных уникальных слов. Вот почему он начинается быстро и становится все медленнее и медленнее.
Все, что вам нужно, это if word in hash:
, что в 99,9999999% случаев занимает время, не зависящее от количества ключей - одна из основных причин, по которой вам нужно диктовать.
Не справиться и с statlist[hash[word]]
. Кстати, фиксированный размер в statlist=[0]*43990
нуждается в объяснении.
Больше проблем
Проблема A: Либо (1) ваш код подвергся искажению отступов при публикации, либо (2) hash
никогда не будет обновляться этой функцией. Проще говоря, если word
нет в hash
, т.е. когда вы впервые его видите, абсолютно ничего не происходит. Оператор hash[word] = n
(ЕДИНСТВЕННЫЙ код, который обновляет hash
) НЕ выполняется. Так что ни слова не будет в hash
.
Похоже, этот блок кода нужно сместить влево на 4 столбца, чтобы он выровнялся по внешнему if
:
else:
hash[word]=n
ref.write('['+str(word)+','+str(n)+']'+'\n')
statlist[hash[word]] = 1
Проблема B: Нет кода для обновления n
(предположительно, количество уникальных слов на данный момент).
Я настоятельно рекомендую вам принять столько предложений, которые мы с @ThatGuy сделали, сколько вы пожелаете, вырвать все вещи global
, исправить свой код, добавить несколько выражений для печати в заметных точках, и запустите его, скажем, 2 документа в каждой из 3 строк, по 4 слова в каждой. Убедитесь, что он работает правильно. Затем запустите его на большом наборе данных (с подавленными отпечатками). В любом случае вы можете регулярно выводить статистику (например, количество документов, строк, слов, уникальных слов, истекшее время и т. Д.).
Другая проблема
Проблема C: Я упомянул об этом в комментарии к ответу @ ThatGuy, и он согласился со мной, но вы не упомянули, что подняли его:
>>> line = "foo bar foo\n"
>>> line.split(" ")
['foo', 'bar', 'foo\n']
>>> line.split()
['foo', 'bar', 'foo']
>>>
Использование вами .split ("") приведет к ложным "словам" и исказит вашу статистику, включая количество уникальных слов, которые у вас есть . Вы вполне можете найти необходимость изменить это жестко закодированное магическое число.
Я снова говорю: Нет кода, который обновляет n
в функции . Выполнение hash[word] = n
кажется очень странным, даже если n
обновляется для каждого документа.