对大素数求和需要时间!如何提高效率?

时间:2019-07-09 01:01:06

标签: python primes

我正在尝试完成Project Euler's 10th problem,但是我当前拥有的代码花费了太多时间,无法完成。

我环顾四周,但无法找到使代码花费更短时间的方法。

这是我的代码:

std::transform(children->begin(), 
               children->end(), 
               back_inserter(ret),
               [](const bfile& in) { return make_shared<bfile>(in); });

正确的答案应该是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)) ,但是,如前所述,我没有完全得到输出。有什么方法可以使此代码更快?

3 个答案:

答案 0 :(得分:0)

一些加快实施速度的提示:

  • 您只需要检查除数,直到一个数字的平方根,即两个数字的乘积越大,得出的结果就越大。
  • 您也只能搜索素数除数,也许将找到的素数添加到列表中或类似的东西中。

您要使用更有效的算法,请结帐https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 1 :(得分:0)

  

现在它需要32.98秒才能完成。我希望看到更快   算法

您应该使用 Eratosthenes筛网。忽略这一点,这种返工应该使您的时间少于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))

isPrime()中处理偶数数字作为特例,然后处理奇数除数。使用 comprehension generator表达式将更多的循环代码降低到 C 级别,通常可以提高速度。

答案 2 :(得分:0)

使用Eratosthenes筛子:

$ 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

在我的机器上大约四分之一秒。