导入numpy可加快基本和

时间:2019-06-22 09:22:36

标签: python numpy optimization

我对前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)

,运行速度稍快(约155ms)。看来sum()并不是很快。这让我想知道将列表素数转换为numpy数组会做什么。不确定numpy是否已正确安装,我通过在顶部添加来更改了第一个示例:

import numpy as np

令我惊讶的是,仅此包含在内,每次迭代的速度就可以提高13ms至152ms。

iPython的所有计时如下:

%timeit %run script.py

标准错误在1000微秒以下。

通过{魔术}导入numpy可以使sum()运行得更快,是什么原因?

0 个答案:

没有答案