我有一个清单。它相当大。它有超过 100 万个条目。我想计算其中每个字符串的频率。它将数字存储为从 1 到 1000 的字符串。我使用了以下内容,但它会持续运行数小时:
d = {b:a.count(b) for b in a}
n, m = d.keys(), d.values()
print n, m
我有一个清单。它相当大。它有超过 100 万个条目。我想计算其中每个字符串的频率。它将数字存储为从 1 到 1000 的字符串。我使用了以下内容,但它会持续运行数小时:
d = {b:a.count(b) for b in a}
n, m = d.keys(), d.values()
print n, m
改用collections.Counter
:
from collections import Counter
d = Counter(a)
n, m = d.keys(), d.values()
print n, m
我认为在这种情况下使用字典要容易得多。插入字典非常快,从字典中检索也同样快。
这是一个示例程序,正是这样做的:
import datetime
import random
def create_string(choice, size):
str = ''
for i in range(size):
str = str + random.choice(choice)
return str
def count_all(strings):
count_dict = {}
for i in strings:
if i not in count_dict:
count_dict[i] = 1
else:
count_dict[i] = count_dict[i] + 1
return count_dict
if __name__ == '__main__':
all_strings = []
for i in range(1000000):
all_strings.append(create_string(['a','b','c'], 4))
start = datetime.datetime.now()
c_dict = count_all(all_strings)
end = datetime.datetime.now()
print 'Took:', end - start
print 'The count of aacc is ', c_dict['aacc']
它如何公平?
./speed_test.py
Took: 0:00:00.219815
The count of aacc is 12317
一点都不差,嘿?作为替代选项,要解决 Ant 提到的问题,您希望在进行计数时消除重复项。我们可以为此使用一个集合:
d = {b:a.count(b) for b in set(a)}
根据我的测试,这不如字典方法快,但不到一秒就足够了。
它很慢,因为您正在为每个字符串运行 a.count !
l = ['a', 'b', 'a']
thenstr.count
将在“a”上被调用两次,在“b”上被调用 1 次。
当然,第二次在“a”上,字典中的结果只是被覆盖了,所以你甚至不会注意到它
改用默认字典
from collections import defaultdict
d = defaultdict(int)
for obj in your_list:
d[obj] += 1
或者,再次从集合模块,计数器http://docs.python.org/2/library/collections.html#counter-objects