Я бы предположил, что ваше текущее использование filter
является неправильным подходом для генерации. Позволив filter
сгенерировать complete результат, чтобы вы могли измерить его длину, вы потеряли все преимущества использования генератора!
Вместо этого рассмотрите подход генератора, где, если на любом этапепоколение мы обнаруживаем без остатка деление, вся цепочка генерации останавливается и мы возвращаем False
:
def is_prime(n):
if n <= 2 or n % 2 == 0:
return n == 2
return not any(filter(lambda x: n % x == 0, range(3, int(n ** 0.5) + 1, 2)))
Учитывая, что filter
, any
и range
все ленивы, мы только завершаем генерациюв случае простого. Вам все равно, 15 имеет несколько простых делителей, но ваш оригинальный подход filter
находит их обоих! Приведенный выше подход должен решить вопрос "является ли он простым" , как только он найдет свой первый делитель, а не смотреть дальше.