我正在尝试完成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))
,但是,如前所述,我没有完全得到输出。有什么方法可以使此代码更快?
答案 0 :(得分:0)
一些加快实施速度的提示:
您要使用更有效的算法,请结帐https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
答案 1 :(得分:0)
现在它需要32.98秒才能完成。我希望看到更快 算法
您应该使用
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
在我的机器上大约四分之一秒。