【发布时间】:2016-12-23 15:33:44
【问题描述】:
我试图找出所有低于 1 000 000 的素数。由于所有非素数都可以分解为素数,我的方法是将素数列表作为 [2, 3] 开始,然后遍历每个数字直到1 000 000。如果一个数字可以被 prime_list 中的任何数字整除,那么它就不是素数,然后我转到下一个数字。如果这个数字不能被 prime_list 中的任何数字整除,那么它一定是素数,并且它被添加到这个列表中。
为了尝试提高效率,我添加了一条语句,仅检查有问题的数字是否可以被该数字平方根以下的值整除。我认为这会减少很多计算时间,但实际上它会使我的程序花费更长的时间。谁能解释一下为什么?
这是我的代码:
import math
import time
start_time = time.time()
prime = [2, 3]
def prime_checker(a):
for j in prime:
if j < (int(math.sqrt(a)) +1 ): /// without this line, the program runs faster
if a % j == 0:
return False
for i in range (2, 100000):
if prime_checker(i) != False:
prime.append(i)
print prime[-1]
print "Time taken = ", time.time() - start_time
【问题讨论】:
-
您正在重复执行一项与
j的值无关的昂贵操作。在循环外计算math.sqrt(a)一次。 -
您可能会做得更好:保持一个最大素数的索引,当平方时,它不会超过当前测试的数字。当您从 i 转到 i+1 时,您可以通过单个无平方根测试来更新此索引。然后您立即知道要尝试的除数范围。
标签: python algorithm optimization primes