我对前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()
运行得更快,是什么原因?