Я не хочу брать на себя ответственность за ответ Марка Мейера, поскольку он придумал концепцию использования накопления, а также того, что они более питонны / читабельны, но если вы ищете «самый быстрый» подход, тогдаизменение его подхода с использованием map
против использования пониманий происходит быстрее.
any(map(goal.__le__, accumulate(map(val.__lt__, listItems))))
Просто для проверки:
from timeit import timeit
from itertools import accumulate
def check1(listItems, val):
goal = len(listItems)*0.8
return any(x > goal for x in accumulate(n > val for n in listItems))
def check2(listItems, val):
goal = len(listItems)*0.8
return any(map(goal.__le__, accumulate(map(val.__lt__, listItems))))
items = [1, 2, 2, 3, 4, 2, 4, 1, 1, 1]
for t in (check1, check2):
print(timeit(lambda: t(items, 1)))
Результаты:
3.2596251670038328
2.0594907909980975