Python:需要性能来检索大列表中的字符串

时间:2015-12-04 22:21:25

标签: python performance pattern-matching

email_process_list是一个列表,其元素是电子邮件。 每封电子邮件都由一个单词列表表示。 我有一个名为words_to_delete的大名单,其中包含36,000个单词。 对于每封电子邮件,我想删除words_to_delete中包含的单词。 如下:

new=list()
for email in email_process_list:
    email_clean=[word for word in email if word not in words_to_delete]
    new.append(email_clean)

问题:需要花费很多时间。我有16Go Ram,它已经运行了几个小时。感谢

1 个答案:

答案 0 :(得分:1)

列表查找很慢(线性时间),设置查找很快(恒定时间)。在开始循环之前将words_to_delete转换为一个集合。

如果您的内存遇到问题,您还可以在处理原始列表时缩小原始列表。这样,您就不必在内存中保留同一封电子邮件的两个版本(原始和已清理)。

new=list()
words_to_delete = set(words_to_delete)
email_process_list = email_process_list[::-1]
while len(email_process_list) > 0:
    email = email_process_list.pop()
    email_clean=[word for word in email if word not in words_to_delete]
    new.append(email_clean)

我反转email_process_list以允许我们弹出第一个(现在最后一个)对象,这比调用email_process_list.pop(0)便宜。如果您不关心new中电子邮件的顺序,则可以删除第三行。