Как показывает ответ Оскара, ваш алгоритм повторяет много работы. Чтобы увидеть, сколько обработки экономит другой алгоритм, рассмотрим следующую модифицированную версию функций mark()
и isprime()
, которая отслеживает, сколько раз была вызвана функция и общее количество итераций цикла:
calls, count = 0, 0
def mark(sieve, x):
global calls, count
calls += 1
for i in xrange(x+x, len(sieve), x):
count += 1
sieve[i] = False
После запуска первого кода с этой новой функцией мы можем видеть, что mark()
вызывается 223 раза с общим количеством 4 489 006 (~ 4,5 миллиона) итераций в цикле for.
calls, count = 0
def isprime(n):
global calls, count
calls += 1
for x in xrange(3, int(n**0.5)+1):
count += 1
if n % x == 0:
return False
return True
Если мы сделаем подобное изменение в вашем коде, мы увидим, что isprime()
вызывается 1 000 000 (1 миллион) раз с 177 492 735 (~ 177,5 миллионами) итераций цикла for.
Подсчет вызовов функций и итераций цикла не всегда является убедительным способом определить, почему алгоритм работает быстрее, но обычно меньше шагов == меньше времени, и, очевидно, ваш код может использовать некоторую оптимизацию для сокращения количества шагов.