如何让这个代码在python上运行得更快?

时间:2015-06-08 02:02:28

标签: python performance helpers

我在python上编写了这个片段来解决项目Euler问题#10,但是我已经等了15分钟(运行这段代码)并且它仍然没有结束。

请帮我改进此代码或进行优化。

以下是摘录:

def prime (n):
  f = 1 #flag
  for i in range(2,n):
    if n % i == 0:
        f = 0
  return f

s = 0 # Sum
for i in range(2,2000000):
if prime(i) == 1:
    s = i  +  s
print s

2 个答案:

答案 0 :(得分:4)

import math

def prime (n):
    for i in xrange(2, int(math.sqrt(n))+1):
        if n % i == 0:
            return False
    return True

s = 2 # Sum
for i in xrange(3,2000000, 2):
    if prime(i):
        s += i
print s

对我而言,它的运行时间不到10秒。

首先,一旦你发现了一个数字是复合的,你想从prime返回。

其次,你不想检查偶数。使用xrange(3,2000000, 2)

跳过它们

第三,没有必要检查2nprime的所有号码,因为a*b = b*a

由于您使用的是Python 2,我已将range替换为xrange,因此效率会更高一些。

答案 1 :(得分:1)

如果您希望所有素数达到2000000,您应该考虑使用 Eratosthenes筛选

python中的代码: -

def eratosthenes2(n):
    multiples = set()
    for i in range(2, n+1):
        if i not in multiples:
            yield i
            multiples.update(range(i*i, n+1, i))

print(list(eratosthenes2(2000000)))

来源 - http://rosettacode.org/wiki/Sieve_of_Eratosthenes#Python

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes