【发布时间】:2019-08-30 00:23:57
【问题描述】:
问题:虽然下面的代码有效,但它需要很长时间才能找到小于 2,000,000 的所有素数之和。
过去的尝试:我尝试实现 while 循环、计数器和许多其他工具来修改代码,但它们最终也修改了我的结果。以前,我只是将数字添加到现有变量中,而不是将它们附加到列表中,但结果是相同的。
我相信生成器函数/表达式会解决问题,但我在实现函数、表达式或两者时遇到了麻烦。
# Prime number determiner
def is_prime(x):
for i in range(2, x-1):
if x % i == 0:
return False
else:
return True
# Function summing all prime numbers between 2 and 2,000,000
for i in range(2, 2000000):
if is_prime(i) is True:
primes.append(i)
results = sum(primes)
print(primes)
生成器表达式/函数的先前尝试:
#Generator version of above
def is_prime_gen(x):
yield (i for i in range(2, x-1) if x % i == 0)
sum_prime += (j for j in range(2, 2000000) if is_prime_gen(j))
预期结果:我不需要处理超快的结果,但我希望它在一两分钟内处理。
奖励:对于任何回复的人,如果您还可以解释您是如何得出结论的,那将对我有所帮助(虽然“经验”是一个有效的解释,但它没有帮助)。
【问题讨论】:
-
我不知道你的问题完全是重复的,但是有很多素数生成函数in this previous question。
-
@Blckknght - 是的,我在发布我的问题之前看到了那个。我认为它在一般意义上的优化方面很有帮助,但我没有在帖子中看到在解决方案中使用生成器的任何地方。也许这是我对生成器的误解的问题,但这似乎是一个可以从它们的实施中受益的完美情况。
-
如果您出于某种原因想要强调生成器功能,我认为您需要重新表述您的问题。您的问题强调性能(因为您当前的代码太慢),并且您显示的第一个代码块根本不使用生成器函数。
-
更新了@Blckknght。
-
想要将性能降低到几分钟并不是很有野心。我不明白为什么使用基于筛子的方法只需几秒钟。生成器似乎不太相关。缺少生成器并不是您的代码滞后的原因。
标签: python python-3.x performance optimization primes