如何让Python更快地工作?

时间:2013-03-24 13:56:44

标签: python

我正在尝试计算低于200万的所有素数的总和,因为我已经编写了一个函数来找到小于给定数的素数,我只是写了一个新函数来调用旧函数并总结该列表中的项目。

但似乎它需要永远。如何加快此代码的速度?

def find_primes(n):
    "Find the prime numbers below n"
    primes=[];
    for i in range(2,n):
        for fac in range (2,i):
            if i!=fac and i%fac == 0:
                break
        else:
            primes.append(i)
    return primes

def add_primes(m):
    "Sum all the prime numbers below m"
    newlist=find_primes(m);
    t=sum(newlist);
    return t
PS:我对Python很新手,所以如果你能很好地解释我的错误,我会很高兴的。提前谢谢。

2 个答案:

答案 0 :(得分:3)

实施Sieve of Eratosthenes。这将使您的代码所做的工作比目前的工作少得多,使其快得多。

答案 1 :(得分:0)

您可以将for fac in range (2,i)行替换为:

来改善当前代码
for fac in primes:

代码:

def find_primes1(n):
    "Find the prime numbers below n"
    primes=[2,3]     #initialize primes with 2 values
    for i in range(4,n):
        for fac in primes:
            if i!=fac and i%fac == 0:
                break
        else:
            primes.append(i)
    return primes

时间比较:

In [6]: %timeit find_primes(10**4)   # your version
1 loops, best of 3: 2.33 s per loop

In [7]: %timeit find_primes1(10**4)
1 loops, best of 3: 171 ms per loop

In [8]: find_primes1(10**3)==find_primes(10**3)
Out[8]: True

但是对于较大的值,您一定要学习Sieve of Eratosthenes方法。