gpt4 book ai didi

python - any() 的性能

转载 作者:太空狗 更新时间:2023-10-30 00:06:58 24 4
gpt4 key购买 nike

这主要是学习 Python 的练习。我写了这个函数来测试一个数是否是质数:

def p1(n):
for d in xrange(2, int(math.sqrt(n)) + 1):
if n % d == 0:
return False
return True

然后我意识到我可以使用 any() 轻松重写它:

def p2(n):
return not any((n % d == 0) for d in xrange(2, int(math.sqrt(n)) + 1))

在性能方面,我期望 p2 比 p1 快,或者至少和 p1 一样快,因为 any() 是内置的,但是对于一个大素数,p2 会慢很多:

$ python -m timeit -n 100000 -s "import test" "test.p1(999983)"
100000 loops, best of 3: 60.2 usec per loop

$ python -m timeit -n 100000 -s "import test" "test.p2(999983)"
100000 loops, best of 3: 88.1 usec per loop

我在这里使用 any() 不正确吗?有没有一种方法可以使用 any() 编写此函数,以便它尽可能地迭代我自己?

更新:更大素数的数字

$  python -m timeit -n 1000 -s "import test" "test.p1(9999999999971)"
1000 loops, best of 3: 181 msec per loop

$ python -m timeit -n 1000 -s "import test" "test.p2(9999999999971)"
1000 loops, best of 3: 261 msec per loop

最佳答案

性能差异很小,但它存在的原因是与 for 循环相比,any 会导致构建生成器表达式和额外的函数调用。不过,两者具有相同的行为(快捷方式评估)。

随着输入量的增加,差异不会减小(我错了),因为您使用的是生成器表达式,迭代它需要调用一个方法 (.next()) 和一个额外的栈帧。当然,any 会在后台执行此操作。

for 循环遍历 xrange 对象。 any 遍历生成器表达式,生成器表达式本身遍历 xrange 对象。

无论哪种方式,使用产生最可读/可维护代码的那个。选择一个而不是另一个对您正在编写的任何程序的性能影响很小(如果有的话)。

关于python - any() 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26578648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com