Fre*_*ter 1 python list-comprehension list
我有两个清单:
allwords(~100,000个元素)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很新,我很感激任何建议.
谢谢!
做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)