Там целый мир решений, которые хуже, чем Решение TigerhawkT3/Vignesh Kalai. Для сравнения:
>>> timeit.timeit("len(set(string.split()))", "string=\""+string+"\"")
9.243406057357788
- их реализация. Я на самом деле были большие надежды на этот:
>>> timeit.timeit("len(set(map(hash,string.split())))", "import numpy\nstring=\""+string+"\"")
14.462514877319336
, потому что здесь, то set
только надстраивается над хэшей. (И поскольку хеши - это числа, их не нужно сами хэшировать, или я так надеялся. Тип обработки в set
, вероятно, все равно убивает меня, иначе теоретически количество вычислений хэшей будет таким же, как в лучшем но там, возможно, был менее неудобный манипулятор PyObject. Я был не прав.)
Так что я попытался разобраться с хэшами в numpy; сначала с необработанными струнами, для сравнения:
>>> timeit.timeit("len(numpy.unique(string.split()))", "import numpy\nstring=\""+string+"\"")
33.38827204704285
>>> timeit.timeit("len(numpy.unique(map(hash,string.split())))", "import numpy\nstring=\""+string+"\"")
37.22595286369324
>>> timeit.timeit("len(numpy.unique(numpy.array(map(hash,string.split()))))", "import numpy\nstring=\""+string+"\"")
36.20353698730469
Последнее применение: Счетчик может просто обходить шаг восстановления. Но опять же, строки Python просто PyObjects и вы действительно не получить, имея вместо этого dict
из set
:
>>> timeit.timeit("max(Counter(string.split()).values())==1", "from collections import Counter\nstring=\""+string+"\"")
46.88196802139282
>>> timeit.timeit("len(Counter(string.split()))", "from collections import Counter\nstring=\""+string+"\"")
44.15947103500366
Кстати: Половина времени лучшее решение переходит в расщеплении:
>>> timeit.timeit("string.split()", "import numpy\nstring=\""+string+"\"")
4.552565097808838
и контр-интуитивно, что время даже возрастает, если вы указываете, что только хотите разделить вдоль пространства (а не все типичные разделители):
>>> timeit.timeit("string.split(' ')", "import numpy\nstring=\""+string+"\"")
4.713452100753784
Я бы предложил вам изучить NLTK, простой скрипт на python не будет эффективен при работе с более крупными файлами. – Leb
Легко. Для каждой строки создайте контейнер. Токенизируйте линию (например, на основе пробелов) и выпустите каждый токен в набор. Затем подсчитайте количество элементов в этом наборе. – Santa
@Leb - NTLK здесь не кажется необходимым. – TigerhawkT3