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
,但是,正如前面提到的,我没有得到完整的输出。有没有办法让这段代码更快

加快实施的一些技巧:

  • 你只需要检查一个除数,直到一个数字的平方根,两个更大的数字的乘积,它会给出一个更大的结果
  • 你也可以只搜索素数因子,也许把找到的素数添加到列表或类似的东西中

如果您想要更高效的算法,请查看一些加速实现的提示:

  • 你只需要检查一个除数,直到一个数字的平方根,两个更大的数字的乘积,它会给出一个更大的结果
  • 你也可以只搜索素数因子,也许把找到的素数添加到列表或类似的东西中
如果你想要一个更有效的算法,请结帐

现在它需要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(数字):
如果号码
现在它需要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下都很容易解决