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

时间:2017-02-09 15:35:43

标签: python list list-comprehension

我有两个清单:

  1. 单词列表allwords(〜100.000个元素)
  2. 停用词列表stopwords(~2000个元素)
  3. 我想从列表selectedwords生成一个新列表allwords,其中所有字词都不在stopwords中。

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

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

    问题:有更聪明的方法可以加快计算速度(使用python)。我对python很新,我很感激任何建议。

    谢谢!

2 个答案:

答案 0 :(得分:6)

stopwords设为set,然后not in检查速度很快。

编辑:一些基准将它与@ deceze的方式进行比较(我删除了.lower()和停止词集的准备(无论如何都是小的),以便专注于两种方式的实际差异。) / p>

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))

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

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

答案 1 :(得分:4)

假设这些列表中没有重复项和/或您想要删除列表,并且您不关心订单,请创建两个集并获得差异:

selectedwords = set(map(str.lower, allwords)) - set(stopwords)