【问题标题】:Why does my first function to find a prime number take so much longer than the other?为什么我的第一个查找素数的函数比另一个函数花费的时间要长得多?
【发布时间】:2021-04-14 19:59:21
【问题描述】:

我有两个函数:isPrime 和 alsoPrime。如果数字 (x) 是质数,两者都意味着返回 True 或 False。 isPrime(x, pLis) 处理不断增长的素数列表,并查看 x 是否是任何素数的倍数。 alsoPrime(x) 搜索从 3 开始到 x 的根结束的所有奇数。然后我使用一个 for 循环,从 3 开始,以 2 为间隔上升。

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

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

also Prime -> 3, 5, 7, 9, 11, 13, 15, 17, 19

但alsoPrime 的速度要快得多 - 搜索前 100 万个数字时快 100 倍。

谁能解释一下原因?每次拨打pLis是否需要很长时间?


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

【问题讨论】:

    标签: python python-3.x optimization primes


    【解决方案1】:

    您正在遍历您在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 已经发现是这种情况。问题是为什么更多的迭代比更少的迭代更快。
    • 哎呀,我误读了这个问题。刚刚更正了我的答案。
    • 当然,非常感谢!我非常关注非素数的转义条件,以至于我没有意识到在素数的情况下我会遍历整个列表
    猜你喜欢
    • 2012-09-19
    • 2021-11-17
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多