我有一个小的Python程序,可以逐行遍历一个超过5百万行的大型文本文件,如果符合条件就从每一行中提取一个单词,然后如果它不在列表中就将该单词添加到列表中。之后,我需要对这个巨大的列表进行字母顺序排序,然后将列表中的项目写入新的文本文件。
代码如下:
代码如下:
big_list = []
with open('big_text_file.txt', 'r', encoding='UTF8') as f:
for line in f:
# some validation specific to line structure:
if line[0] not in (1, 2, 3, 4, 5, 6, 7, 8, 9, 0) and '\t' in line:
word = line.rsplit('\t')[0].lower()
if word not in big_list:
big_list.append(word)
sorted_list = sorted(big_list)
with open('results_file.txt', 'w', encoding='UTF8') as r:
for item in sorted_list:
r.write(item + "\n")
问题在于速度非常慢。有500万行,现在已经运行了12个小时以上(!),但仍远未完成。我一定做错了什么。我有一个有8个核心的CPU,但在这种情况下只使用了一个。CPU负载仅为12%。我可以应用多进程来加快速度吗?或者由于此代码很简单,因此它不会产生太大作用?我仍然需要验证所有单词是否与一个列表匹配。
非常感谢任何建议。
O(1)
的时间内测试一个集合中是否存在成员,而对于列表则需要O(n)
的时间。 - jonrsharpeline[0]
不是(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)中的一个,那不是你想要的。你想要的是if not line[0].isdigit()
。line[0]
是一个字符,而不是一个整数。 - Jean-François FabreO(n^2)
,并且很容易变成O(k << n)
。(这里,k
是与你的 预期 条件匹配的行数。) - Arya McCarthy