Python 求大素数的和需要时间!我如何使它更有效率?
我正在尝试完成,但我目前拥有的代码花费了太多时间,无法完成 我环顾了四周,但还没有找到如何缩短代码运行时间的方法 这是我的代码:Python 求大素数的和需要时间!我如何使它更有效率?,python,primes,Python,Primes,我正在尝试完成,但我目前拥有的代码花费了太多时间,无法完成 我环顾了四周,但还没有找到如何缩短代码运行时间的方法 这是我的代码: def IsPrime(num): for i in range(2, num/2): if num % i == 0: prime = False return prime prime = True return prime def SumOfPrime(limit):
def IsPrime(num):
for i in range(2, num/2):
if num % i == 0:
prime = False
return prime
prime = True
return prime
def SumOfPrime(limit):
primesum=2+3 #For some reason my prime finder doesn't allow numbers below 5
for check in range(5,limit):
prime=IsPrime(check)
if prime == True:
primesum += check
return primesum^2
print(SumOfPrime(2000000))
正确的答案应该是
142913828922
,但是,正如前面提到的,我没有得到完整的输出。有没有办法让这段代码更快 加快实施的一些技巧:
- 你只需要检查一个除数,直到一个数字的平方根,两个更大的数字的乘积,它会给出一个更大的结果
- 你也可以只搜索素数因子,也许把找到的素数添加到列表或类似的东西中
如果您想要更高效的算法,请查看一些加速实现的提示:
- 你只需要检查一个除数,直到一个数字的平方根,两个更大的数字的乘积,它会给出一个更大的结果
- 你也可以只搜索素数因子,也许把找到的素数添加到列表或类似的东西中
def isPrime(number):
if number <= 2:
return number == 2
if number % 2 == 0:
return False
for divisor in range(3, int(number ** 0.5) + 1, 2):
if number % divisor == 0:
return False
return True
def sumOfPrimes(limit):
return sum(number for number in range(limit) if isPrime(number))
print(sumOfPrimes(2000000))
def isPrime(数字):
如果号码
现在它需要32.98秒才能完成。我想看一场更快的比赛
算法
你应该用一筛埃拉托斯坦。忽略这一点,此返工应使您的时间不超过10秒:
def isPrime(number):
if number <= 2:
return number == 2
if number % 2 == 0:
return False
for divisor in range(3, int(number ** 0.5) + 1, 2):
if number % divisor == 0:
return False
return True
def sumOfPrimes(limit):
return sum(number for number in range(limit) if isPrime(number))
print(sumOfPrimes(2000000))
def isPrime(数字):
如果数量使用埃拉托斯坦筛:
$ python
Python 2.7.13 (default, Mar 13 2017, 20:56:15)
[GCC 5.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def sumPrimes(n):
... i, p, ps, m, sum = 0, 3, [2], n // 2, 2
... sieve = [True] * m
... while p <= n:
... if sieve[i]:
... sum += p
... for j in range((p*p-3)/2, m, p):
... sieve[j] = False
... i, p = i+1, p+2
... return sum
...
>>> from time import time
>>> start = time(); print sumPrimes(2000000); print time() - start
142913828922
0.262000083923
$python
Python 2.7.13(默认值,2017年3月13日,20:56:15)
[GCC 5.4.0]关于cygwin
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>def sumPrimes(n):
... i、 p,ps,m,和=0,3,[2],n//2,2
... 筛子=[True]*m
... 而p>>从时间导入时间
>>>开始=时间();打印素数(2000000);打印时间()-开始
142913828922
0.262000083923
在我的机器上大约四分之一秒。使用埃拉托斯坦筛:
$ python
Python 2.7.13 (default, Mar 13 2017, 20:56:15)
[GCC 5.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def sumPrimes(n):
... i, p, ps, m, sum = 0, 3, [2], n // 2, 2
... sieve = [True] * m
... while p <= n:
... if sieve[i]:
... sum += p
... for j in range((p*p-3)/2, m, p):
... sieve[j] = False
... i, p = i+1, p+2
... return sum
...
>>> from time import time
>>> start = time(); print sumPrimes(2000000); print time() - start
142913828922
0.262000083923
$python
Python 2.7.13(默认值,2017年3月13日,20:56:15)
[GCC 5.4.0]关于cygwin
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>def sumPrimes(n):
... i、 p,ps,m,和=0,3,[2],n//2,2
... 筛子=[True]*m
... 而p>>从时间导入时间
>>>开始=时间();打印素数(2000000);打印时间()-开始
142913828922
0.262000083923
在我的机器上大约四分之一秒。对于范围(2,num/2)内的i:
我会将上限设置为int(sqrt(num))+1
,我也可以给出一个更有效的算法,但你想加速这个算法吗?这帮了大忙!我得到了正确的结果,现在需要32.98秒才能完成。我希望看到一个更快的算法,因为它当然不是完美的。嗯,你也可以将找到的素数保存在一个列表中,然后检查一个数字是否是素数除以之前找到的素数,如果你想找到一个更好的方法来查找素数,签出看起来很有趣,非常感谢!也许将这两件事作为答案发布,这样我就可以将问题标记为已解决?=)由于2是唯一的偶数素数,在您的IsPrime
方法中,您可以检查2作为除数,然后只检查奇数除数:3,5,7,9,11。。。直到平方根。效率不如筛子,但应该可以将检查数字所花费的时间减半。对于范围内的i(2,num/2):
我会将上限设置为int(sqrt(num))+1
,我也可以给出一个更有效的算法,但你想加速这个算法,对吗?这很有帮助!我得到了正确的结果,现在需要32.98秒才能完成。我希望看到一个更快的算法,因为它当然不是完美的。嗯,你也可以将找到的素数保存在一个列表中,然后检查一个数字是否是素数除以之前找到的素数,如果你想找到一个更好的方法来查找素数,签出看起来很有趣,非常感谢!也许将这两件事作为答案发布,这样我就可以将问题标记为已解决?=)由于2是唯一的偶数素数,在您的IsPrime
方法中,您可以检查2作为除数,然后只检查奇数除数:3,5,7,9,11。。。直到平方根。效率不如筛子,但检查数字的时间应该减少一半。在我的机器上,在Python3中,这会导致“TypeError:‘float’对象不能解释为整数”。在Python2中,它为n==2
或更小的值返回错误的结果。除非将浮点作为参数n
传递,否则算法中任何地方都没有浮点。我已经安装了Python 2.7.13。它很好用sumPrimes(2)
正确返回2。我没有费心去检查n
小于2或n
a浮点数的情况。我修改了答案以显示标题和计时信息。在Python3中,(p*p-3)/2
是一个浮点值,将其传递给range()
会生成我上面引用的错误。(不是因为<代码> n>代码>是浮点。)请考虑<代码> /< /COD>(整数除法)。如果您按照OP的链接找到Euler问题,则该函数将素数之和小于n
。因此,n==2
的结果是0
,您的2
结果是不正确的。@cdlane答案清楚地表明它是Python 2.7.13代码,那么我们为什么要关注Python 3呢?至于2,它可以很容易地特殊情况下,所以这也不是一个问题,是吗?我遵循了链接,所要求的是2000000的解决方案,而不是2的解决方案。@WillNess,直到我写下我的评论后,答案才清楚地说明它是Python 2.7.3代码。这两个问题在Python2下都很容易解决