【发布时间】:2020-11-15 10:50:50
【问题描述】:
节目说明:
程序接受一段 N 个数字,在我的例子中是 [1024, 289213]。然后它应该输出这个段内所有素数的总和。
我的解决方案:
for i in range(1024, 289213):
isPrime = True
for j in range(2, i // 2):
if (i % j) == 0:
isPrime = False
break
if isPrime:
n += i
print(n)
问题:该程序可以完美地处理小片段,例如 [3,17],但是如果是 [1024, 289213],则需要永远加载。
问题的根源可能是什么?也许有更好的编码方式?提前谢谢你。
【问题讨论】:
-
想想要检查多少个组合,你就知道为什么要花很长时间了。识别素数有更有效的算法,也许你会找到更好的解决方案。
-
另外,Python 中的循环非常慢。如果这对您来说是可能的,那么用 C 或几乎所有其他语言编写相同的算法将导致运行时更小。像
numba这样的 Python 库也将有助于加快您的代码速度。 -
@NiklasMertsch 感谢您的建议,但在此特定任务中需要使用普通 Python)
-
那么另一种更有效的算法可能是要走的路。将内部循环更改为
any和生成器表达式的组合也可能会有所帮助。您可以使用multiprocessing并行化外循环,但这是一个相当大的变化。 sieve of Eratosthenes 是一个不错的选择。
标签: python