Импорт NumPy ускоряет базовую сумму - PullRequest
0 голосов
/ 22 июня 2019

Меня интересовала сумма первых 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() работать быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...