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,它已经运行了几个小时。感谢
答案 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
中电子邮件的顺序,则可以删除第三行。