Python 为什么我的代码在编辑后不能更快地工作?
我是计算机科学和编程新手。我正在参加一个免费的在线编码课程,其中一个作业是编写一个程序,生成第1000个素数 仅供参考,这是在Python 2.5.4中 以下是我从本论坛另一个帖子中复制(并编辑了一点)的原始代码:Python 为什么我的代码在编辑后不能更快地工作?,python,python-2.5,Python,Python 2.5,我是计算机科学和编程新手。我正在参加一个免费的在线编码课程,其中一个作业是编写一个程序,生成第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: retur
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)
我之所以把它包括在内,唯一的原因是我意识到我的算法为3和5生成了“false”,即使它们是素数。我知道你的优化是为了什么,但我认为你实现的逻辑不是你想要的。相反,想想其他方法,你可以减少你必须检查的数字的数量 我推荐的第一个方法是立即排除偶数:
def isprime(n):
if n < 2 or n % 2 == 0:
return False
# ...
总而言之,这里是新的isprime
(编辑:带评论提示):
计算nthprime(5000)
,这两次优化将我的时间从8.497秒减少到0.108秒
编辑:为什么要学习九年前的python版本?如果[3,5]中有n,则应查看python
3.6
:返回True
或如果n==3或n==5:返回True
提示:如果要查找因子对,一个因子始终是您应该对代码计时。在我的系统上衡量,你的新版本快了42%。n/2*2==n
是检查偶数的一种糟糕(在Python 3中是错误的)。int(n**.5)+1
,实际上,当与range
一起使用时(在Python 2.x上应该是xrange
)。至少要检查第1000个素数是7919。@treecoder我很好奇,math.sqrt()
?你没有尽可能多地排除n
值。您甚至可以跳过检查因子。如果n==2:return True,如果n%2==0:return False
,对于x范围内的I(3,int(n**0.5)+1,2):…
@KenY-n math.sqrt(10000)在我的系统上花费了286ns。10000**.5用了23.6ns。(使用timeit
module进行检查)。本身math.sqrt
没有问题,但当我们可以使用运算符进行某些操作时,使用函数感觉不习惯。add(1,1)
没有问题,但是1+1
感觉更好。尽管您可以说,math.sqrt
对于那些不熟悉**
的人来说更具可读性。
if n==3:
return True
if n==5:
return True
def isprime(n):
if n < 2 or n % 2 == 0:
return False
# ...
def isprime(n):
# ...
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
def isprime(n):
if n == 2: return True
if n % 2 == 0: return False
for i in xrange(3, int(n ** 0.5) + 1, 2):
if n % i == 0: return False
return True