如何让Python更快地工作?
问题描述:
我想计算所有低于200万的素数的总和,因为我已经编写了一个函数来查找小于给定数字的素数,所以我简单地写了一个新函数来调用旧函数,将该列表中的项目相加。如何让Python更快地工作?
但它似乎是永远。我怎样才能加快这个代码?
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的新手,所以如果你能很好地解释我的错误,我会很高兴。提前致谢。
答
执行Sieve of Eratosthenes。这会让你的代码比现在做的工作少得多,使得代码更快。
+0
非常感谢,我想不出在我的代码中使用那个。我会立即尝试。 – 2013-03-24 14:04:18
答
你可以通过这个替换为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的方法。
让你的代码更聪明地工作吗? – 2013-03-24 13:58:22
顺便说一下,条件'i!= fac'总是* true,因为'range'不会产生“停止”参数,因此每个循环都进行无用的比较(尽管它应该相当快) 。 – Bakuriu 2013-03-24 14:06:41