【发布时间】:2020-06-12 20:06:24
【问题描述】:
我以前从未遇到过这个问题。
我正在尝试生成非常大的素数。
问题是该程序太慢了,无法使用。
当我修改代码以显示每个 num 时,它通过大数字时仍然显得很慢。
有什么方法可以让 Python(3) 循环更快?
如果没有,有没有办法让我的程序更快?
我的代码
import os, time, random
lower = 100000000000000000
upper = 999999999999999999
fh = open("pit.txt", "w+")
print("Starting...")
x = 0
for num in range(lower, upper + 1):
x = x + 1
if num > 1:
for i in range(2, num):
if (num % i) == 0:
break
else:
print("KEY_CODE = " + str(x))
print(num)
fh.write(str(num) + ",")
print("Done.")
fh.close()
PS:我忘了提到程序将值写入文本文档。
我不怀疑它会减慢程序的速度,因为无论如何都没有打印出来。
【问题讨论】:
-
不同的解决方案,但有一种更快的素数生成算法,称为 Erastosthenes 筛,您可以使用它来加快速度:en.wikipedia.org/wiki/Sieve_of_Eratosthenes
-
对于初学者,您可以通过在每一步将
num增加 2 来将时间减半。 2 是唯一的偶数。 -
这是您的基本但低效的primalty测试的问题。这适用于 1e6 以下的数字,但不适用于您提供的范围。查看高效的 primalty 测试的实现,例如 Miller-Rabin、Sieve of Erathothenes 或类似的东西。
-
您正试图遍历几乎是 quintillion 个数字的范围并生成 quadrillions 个素数。即使您可以每纳秒生成一个素数,这也需要数年时间,而且您会在几秒钟内耗尽磁盘空间。
-
最好的方法往往是实现更好的算法。
标签: python python-3.x loops primes