有解決方案的整個世界是有過之而無不及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