【发布时间】:2017-06-28 00:49:25
【问题描述】:
我是计算机科学和编程的新手。我正在参加一个免费的在线编程课程,其中一项作业是编写一个程序来生成第 1000 个素数。
仅供参考,这是在 Python 2.5.4 中
这是我从这个论坛的另一个帖子中复制(并稍作编辑)的原始代码:
def isprime(n):
if n<2:
return False
else:
for i in range(2,(n/2+1)):
if n%i==0:
return False
else:
return True
def nthprime(n):
x=[]
j=2
while len(x)<n:
if (isprime(j)) == True:
x.append(j)
j =j+1
return(x[n-1])
print nthprime(1000)
但是,我认为我可以通过如下重写 isprime(n) 函数来使程序更快:
def isprime(n):# First the primality test
i=1
if n<2:
return False
if (n!=2 and (n/2*2==n)):
return False
if n==3:
return True
if n==5:
return True
else:
while i <= (n/2+1):
i+=2
if n%i==0:
return False
else:
return True
这样,当它只检查 n 是否可以被奇数整除时(代码中的这一点,我们已经知道 n 是奇数,因此不能被任何偶数整除)。
我认为以这种方式重写它会使程序运行速度提高一倍(因为它只检查一半的数字),但它似乎花费了相同的时间,甚至比原来的时间稍长一些之前服用。
另外,有没有办法重写第二个代码块来摆脱:
if n==3:
return True
if n==5:
return True
我包含它的唯一原因是因为我意识到我的算法会为 3 和 5 生成“假”,即使它们是素数。
【问题讨论】:
-
你为什么要学习一个九岁的python版本?你应该看看 python
3.6 -
if n in [3,5]: return True或if n == 3 or n == 5: return True -
提示:如果您正在寻找因子对,一个因子将始终是
-
你应该为你的代码计时。在我的系统上测得,您的新版本速度提高了 42%。
-
n/2*2==n是检查偶数的一种不好(在 Python 3 中是错误的)方法。
标签: python python-2.5