Меня интересовала сумма первых 200 000 простых чисел, я написал следующий код:
import math
primes = [2, 3, 5]
candidate = 7
step = 4
while candidate <= 200000:
limit = math.floor(math.sqrt(candidate))
for prime in primes:
if prime > limit:
primes.append(candidate)
break
if candidate % prime == 0:
break
candidate += step
step = 6 - step
print(sum(primes))
На моей машине она работает примерно за 165 мс.Я попробовал небольшое изменение:
import math
primes = [2, 3, 5]
candidate = 7
step = 4
total = 10
while candidate <= 200000:
limit = math.floor(math.sqrt(candidate))
for prime in primes:
if prime > limit:
total += candidate
primes.append(candidate)
break
if candidate % prime == 0:
break
candidate += step
step = 6 - step
print(total)
, которое работает немного быстрее (около 155 мс).Похоже, что sum()
просто не очень быстро.Это заставило меня задуматься о том, что может сделать преобразование простых чисел списка в массив numpy.Не будучи уверенным в правильности установки numpy, я изменил первый пример, просто добавив вверху:
import numpy as np
К моему удивлению, только включение этого параметра дает скорость от 13 мс до 152 мс за итерацию.
Все тайминги выполняются из iPython следующим образом:
%timeit %run script.py
Стандартные ошибки не превышают 1000 микросекунд.
Что дает, каким волшебством совершаетсяимпорт numpy
заставить sum()
работать быстрее?