Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的第一个寻找素数的函数比另一个要花这么长的时间?_Python_Python 3.x_Optimization_Primes - Fatal编程技术网

Python 为什么我的第一个寻找素数的函数比另一个要花这么长的时间?

Python 为什么我的第一个寻找素数的函数比另一个要花这么长的时间?,python,python-3.x,optimization,primes,Python,Python 3.x,Optimization,Primes,我有两个功能:isPrime和alsoPrime。如果数字(x)是素数,则这两个值都表示返回True或FalseisPrime(x,pLis)列出了越来越多的素数,并查看x是否是任何素数的倍数alsoPrime(x)搜索从3开始,以x的根结束的所有奇数。然后我使用for循环,从3开始,以2的间隔递增 我希望iPrime更快,因为它应该跳过数字,即: iPrime->3,5,7,11,13,17,19 也可以是3,5,7,9,11,13,15,17,19 但是alsoPrime要快得多,在搜索前1

我有两个功能:
isPrime
alsoPrime
。如果数字(x)是素数,则这两个值都表示返回True或False
isPrime(x,pLis)
列出了越来越多的素数,并查看x是否是任何素数的倍数<代码>alsoPrime(x)搜索从3开始,以x的根结束的所有奇数。然后我使用for循环,从3开始,以2的间隔递增

我希望iPrime更快,因为它应该跳过数字,即:

iPrime->3,5,7,11,13,17,19

也可以是3,5,7,9,11,13,15,17,19

但是
alsoPrime
要快得多,在搜索前1000个数字时要快100倍

有人能解释一下原因吗?每次调用
PLI
都要花很多时间吗?


def isPrime(x, pLis):
    for item in pLis:
        if x % item == 0:
            return False
    return True


def alsoPrime(x):
    for i in range(3, round(x**0.5)+1, 2):
        if x % i == 0:
            return False
    return True


您正在遍历在
isPrime
中发现的所有素数,而实际上只需要遍历候选素数的平方,就像在
alsoPrime
中一样。更多的迭代意味着更慢的代码。验证这一点的一种快速方法是计算迭代次数,如下所示:

def isPrime(x, pLis):
    for i, item in enumerate(pLis):
        if x % item == 0:
            print(f"{x} is not prime after {i} iterations")
            return False
    print(f"{x} is prime after {i} iterations")
    return True

OP已经发现了这种情况。问题是为什么迭代次数多比迭代次数少快。哎哟,我误解了这个问题。刚刚更正了我的答案。当然,非常感谢!我是如此专注于非素数的转义条件,以至于我没有意识到我会在素数的情况下遍历整个列表