Здесь можно оптимизировать три вещи:
<> Преобразовать лексику в set
, чтобы не сделать in
операцию без затрат.
lexicon = set(lexicon)
<> Проверить пересечение sentence
с lexicon
наиболее эффективным способом. Он должен использовать set
операций. обсуждалось здесь о выполнении пересечения множества.
[x for x in sentences if set(x.split(' ')).isdisjoint(lexicon)]
<> Используйте filter
вместо понимания списка.
list(filter(lambda x: set(x.split(' ')).isdisjoint(lexicon), sentences))
Окончательный код :
lexicon = set(lexicon)
list(filter(lambda x: set(x.split(' ')).isdisjoint(lexicon), sentences))
Результаты
def removal_0(sentences, lexicon):
lexicon = set(lexicon)
pattern = re.compile(r'\w+')
return [s for s in sentences if not any(m.group() in lexicon for m in pattern.finditer(s))]
def removal_1(sentences, lexicon):
lexicon = set(lexicon)
return [x for x in sentences if set(x.split(' ')).isdisjoint(lexicon)]
def removal_2(sentences, lexicon):
lexicon = set(lexicon)
return list(filter(lambda x: set(x.split(' ')).isdisjoint(lexicon), sentences))
%timeit removal_0(sentences, lexicon)
%timeit removal_1(sentences, lexicon)
%timeit removal_2(sentences, lexicon)
9.88 µs ± 219 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.19 µs ± 55.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.76 µs ± 53.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Примечание. Так что, кажется, фильтр немного медленнее, но я не пока знаю причины.