`all`函数比等效循环快吗?
我对我程序的速度有点担心,但找不到足够的信息来了解它的速度。我相信速度上肯定有差别,但这个差别值得关注吗?
根据文档,这里是它们的等价关系:
def all(iterable):
for element in iterable:
if not element:
return False
return True
3 个回答
1
要比较性能,你可以使用 timeit
模块。
import timeit
def custom_all(iterable):
for element in iterable:
if not element:
return False
return True
test1 = [True] * 1000000
test2 = [True] * 999999 + [False]
print(timeit.timeit(lambda: custom_all(test1), number=1000))
print(timeit.timeit(lambda: all(test1), number=1000))
输出结果:
13.31273860001238
3.087746800039895
再对比一个结果是 False
的情况:
print(timeit.timeit(lambda: custom_all(test2), number=1000))
print(timeit.timeit(lambda: all(test2), number=1000))
输出结果:
12.978889200021513
3.0330674999859184
你可以看到,内置函数的速度明显更快。
1
在使用Python 3.12的时候,我发现内置函数和自定义函数的结果差不多,不过内置函数稍微快一点点。
创建两个数组,其中一个数组在末尾有一个空值:
import numpy as np
arr = np.random.rand(100000)
arr_w_null = arr.copy()
arr_w_null[-1000] = np.nan
创建所有的函数并比较它们的运行时间:
def all_func(iterable):
for element in iterable:
if not element:
return False
return True
# Time the functions
%%timeit -r 10 -n 500
all(arr)
## 3.98 ms ± 77.1 µs per loop (mean ± std. dev. of 10 runs, 500 loops each)
%%timeit -r 10 -n 500
all(arr_w_null)
## 4 ms ± 81.2 µs per loop (mean ± std. dev. of 10 runs, 500 loops each)
%%timeit -r 10 -n 500
all_func(arr)
## 4.18 ms ± 25.7 µs per loop (mean ± std. dev. of 10 runs, 500 loops each)
%%timeit -r 10 -n 500
all_func(arr_w_null)
## 4.19 ms ± 53 µs per loop (mean ± std. dev. of 10 runs, 500 loops each)
3
使用纯Python版本和其他版本之间其实没有太大的区别。是的,纯Python的代码可能会稍微慢一点,但对于这么简单的代码来说,这种慢是不会对你手头的任务造成影响的。
那么,为什么要浪费时间去重新创建一个已经非常有效的函数呢?
当然,你可以自己用timeit
模块来检查一下运行时间,这个模块会自动重复执行一段代码(默认是1_000_000次),然后给出一些统计数据:
In [1]: from timeit import timeit
In [2]: timeit("all(range(1, 1000))", number=100_000)
Out[2]: 2.2896956456825137
In [3]: def myall(iterable):
...: for item in iterable:
...: if not item: return False
...: return True
In [4]: timeit("myall(range(1, 1000))", number=100_000, globals=globals())
Out[4]: 3.4623720655217767