代码永远执行

时间:2017-11-09 05:51:26

标签: python python-3.x list

我有一个花费太多时间的python代码(它实际上从未完成)

imp_pos_words = ' '.join([i for i in pos_word_ls if i not in unimp_words])

'unimp_words'是99,000个字母单词的列表 'pos_word_ls'是15,40,000个字母单词的列表

我实际上想省略'pos_word_ls'中'unimp_words'中的所有单词

PS:'pos_word_ls'有重复的单词,所以我无法输入它到一个集合并执行减去。

请帮助:)

2 个答案:

答案 0 :(得分:1)

set使用unimp_wordsi not in查找速度会快得多。

unimp_words = set(unimp_words)
imp_pos_words = ' '.join([i for i in pos_word_ls if i not in unimp_words])

如果是列表,if i not in unimp_words每次检查一个单词时都必须遍历整个列表。集散列查找速度快得多,列表理解速度也快99,000倍。

答案 1 :(得分:1)

当您检查if i not in unimp_words时,您正在遍历整个列表以查找列表中是否有i,其中是否需要O(n)时间,其中n是列表的长度。由于你要做15,40,000次,所以它会非常慢。

相反,您可以使用的是设置,这会更快。这是因为当您检查项目是否在集合中时,使用散列函数来找出集合中i的位置,这需要O(1)时间。

要将列表unimp_words转换为集合,您可以使用unimp_words = set(unimp_words)。现在,当您检查if i not in unimp_words时,它应该更快。