首页 > 解决方案 > Python 内置函数,例如 any

问题描述

我写了一个函数来知道一个数字在 Python 中是否是素数(在这种情况下使用 Python 3.8.1)。见is_prime_v1下文。然后我想通过使用any内置函数来尝试 v2,见is_prime_v2下文。我很想知道 v1 和 v2 之间的时间差,通过下面的代码,我在计算机上得到以下输出:

v1: 5.224290132522583
v2: 7.654775142669678

这让我很惊讶。我会假设使用any将花费大约相同的时间甚至更快。但这里速度较慢,猜测可能是由于对any自身的函数调用,但我不确定。也许有更深 Python 知识的人可以解释为什么?

from time import time
from math import sqrt


def is_prime_v1(n):
    if n < 3 or n % 2 == 0:
        return n == 2
    for i in range(3, int(sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True


def is_prime_v2(n):
    if n < 3 or n % 2 == 0:
        return n == 2
    return not any(n % i == 0 for i in range(3, int(sqrt(n)) + 1, 2))


if __name__ == '__main__':
    RANGE_SIZE = 2000000

    t = time()
    for i in range(RANGE_SIZE):
        is_prime_v1(i)
    print('v1:', time() - t)

    t = time()
    for i in range(RANGE_SIZE):
        is_prime_v2(i)
    print('v2:', time() - t)

标签: python

解决方案


使用解决方案 2 时,您有 2 个 for 循环,而不是解决方案 1 中的一个:

any 函数中的一个(它需要遍历你给它的值)

一个作为函数的参数any,相当于你原来的 for 循环。

此外,正如@juanpa.arrivilaga 指出的那样,您正在创建一个生成器对象,这会产生额外的开销


推荐阅读