我有两个清单:
allwords
(〜100.000个元素)stopwords
(~2000个元素)我想从列表selectedwords
生成一个新列表allwords
,其中所有字词都不在stopwords
中。
我通过以下列表理解实现了这一点
selectedwords = [word.lower() for word in allwords if word.lower() not in stopwords]
问题:有更聪明的方法可以加快计算速度(使用python)。我对python很新,我很感激任何建议。
谢谢!
答案 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)