我将这个简单的python函数写入calc:
def isPrime(number):
if number == 2:
return True
elif number > 1 and number % 2 != 0:
for current in range(3, number):
if number % current == 0:
return False
return True
我称之为打印出所有素数的总和,从1到200万,如项目euler #10
然而它非常慢,我想知道我是否可以使用发电机解决同样的问题?但我并不完全理解python中的生成器..
如何更有效地解决这个问题的任何帮助将不胜感激!谢谢:))
答案 0 :(得分:0)
首先,我建议您使用更好的功能来检查数字是否为素数。 这是一个更好的修改,来自https://jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/,这是一个很好的 Python中关于生成器的解释。
import math
def is_prime(number):
while True:
if number == 2:
return True
elif number > 1 and number % 2 != 0:
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False
其次,您需要了解Generator实际上做了什么。 Jeff Knupp再次完美地解释了这一点。 简而言之,发电机是一种不会“返回”的功能。它只是"产量"并在调用next()方法时收回控制权。 因此,在函数期间创建的变量不会丢失,并且不会一次又一次地创建函数中定义的变量来保存内存。
然后你可以继续解决欧拉10,这也在链接中解释。 :)
祝欧洲其他成员好运!
答案 1 :(得分:0)
对此问题的另一个攻击角度是尝试不同的算法,而不是尝试优化当前的方法。了解有关生成器的更多信息,但您也可以尝试使用sieve来解决此问题,这可能非常有效。
一般的想法是"标记"所有复合数(不是素数),留下素数。它非常有效,因为我的python实现运行在~3.5秒