Python:列表理解 - 更快的替代方案?

Fre*_*ter 1 python list-comprehension list

我有两个清单:

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

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

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

selectedwords = [word.lower() for word in allwords  if word.lower() not in stopwords]
Run Code Online (Sandbox Code Playgroud)

问题:有没有更聪明的方法来加速计算(使用python).我对python很新,我很感激任何建议.

谢谢!

Ste*_*ann 6

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))
Run Code Online (Sandbox Code Playgroud)

输出(三轮,左边时间是列表理解,右边时间设置差异):

0.5209118997490783 0.9618692664857642
0.5104636869544419 0.9020013947776662
0.48269282831284466 0.8888132040554915
Run Code Online (Sandbox Code Playgroud)

因此,在此测试中,列表理解一致且明显快于设定差异.

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

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

  • 让*两个*列出一个`set`并获得差异...... (2认同)