有解决方案的整个世界是有过之而无不及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