Skip to main content
 首页 » 编程设计

Python:列表理解之更快的选择

2025年05月04日9mengfanrong

我有两个列表:

  1. 单词列表 allwords(~100.000 个元素)
  2. 停用词列表 stopwords(~2.000 个元素)

我想从列表 allwords 中生成一个新列表 selectedwords,其中包含所有不在 stopwords 中的词。

我通过下面的列表理解实现了这一点

selectedwords = [word.lower() for word in allwords  if word.lower() not in stopwords] 

问题:有没有更聪明的方法可以加快计算速度(使用 python)。我是 python 的新手,非常感谢任何建议。

谢谢!

请您参考如下方法:

将stopwords设为set,这样not in检查就快了。

编辑:一些基准测试将它与@deceze 的方式进行比较(我删除了 .lower() 和停用词集的准备(无论如何它很小)以关注实际差异两种方式)。

from timeit import timeit 
 
allwords = list(map(str, range(100000))) 
stopwords = list(map(str, range(0, 100000, 50))) 
 
stopwords_set = set(stopwords) 
 
for _ in range(3): 
    print(timeit(lambda: [word for word in allwords if word not in stopwords_set], number=100), 
          timeit(lambda: set(allwords) - stopwords_set, number=100)) 

输出(三轮,左边是list comprehension,右边是set difference):

0.5209118997490783 0.9618692664857642 
0.5104636869544419 0.9020013947776662 
0.48269282831284466 0.8888132040554915 

所以在这个测试中,列表理解始终比集合差异快得多。

为了比较,使用停用词列表进行测试:

>>> timeit(lambda: [word for word in allwords if word not in stopwords], number=100) 
271.4802689439021