Python 为什么我的代码在编辑后不能更快地工作?

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

我是计算机科学和编程新手。我正在参加一个免费的在线编码课程,其中一个作业是编写一个程序,生成第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)

我之所以把它包括在内,唯一的原因是我意识到我的算法为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