我想弄清楚的是,当我为较小的数字运行此代码时,它返回列表就好了,但对于较大的数字(我会在我正在工作的情况下称之为小) 。)如29996299,它会运行很长一段时间,我等了45分钟没有结果,不得不最终杀死程序。我想知道的是,是否有一种更有效的方法来处理规模大于4或5位的数字。我已经测试了范围函数的一些排列,看看是否有更好的方法来处理我想要生成的列表的限制,但似乎没有任何影响对计算所需的时间量。我是python的新手,并不是一个经验丰富的程序员。谢谢你的时间。
在提交这篇文章之前再次运行程序,花了一个半小时左右。
程序的功能是取用户选择的数字,用它来生成下界,查找绑定和输入之间的所有素数并附加到列表,然后生成一个上限并查找所有素数然后追加到列表,用于创建从初始编号向前和向后延伸的列表。 该计划的工作方式与我预期的一样,但并不像我需要的那样快,因为我要处理的数字会很快变大,在每个阶段几乎翻倍。
initial_num = input("Please enter a number. ")
lower_1 = int(initial_num) - 1000
upper_1 = int(initial_num)
list_1 = []
for num in range(lower_1,upper_1):
if num > 1:
for i in range(2,num):
if (num % i) == 0:
break
else:
list_1.append(num)
lower_2 = list_1[-1]
upper_2 = list_1[-1] + 2000
list_2 = []
for num in range(lower_2,upper_2 +1):
if num > 1:
for i in range(2,num):
if (num % i) == 0:
break
else:
list_2.append(num)
list_3 = list_1 + list_2[1:]
print list_3
答案 0 :(得分:3)
您可以使用更有效的算法生成最多N的素数列表。这是Sieve of Erathostenes。请查看链接的文章,它甚至包括一个示例伪代码。该算法的基本思想是:
最后,你会得到一个素数列表。
Pyhton from here
中的实现def eratosthenes2(n):
multiples = set()
for i in range(2, n+1):
if i not in multiples:
yield i
multiples.update(range(i*i, n+1, i))
print(list(eratosthenes2(100)))
为了减少内存消耗,您可以考虑使用一个bitset,为每个数字存储一位。这应该会减少32到64倍的内存使用量。 python here可以使用bitset实现。