为什么 "in" 生成器比 python 中的 "in" 列表快得多
why "in" generator is much faster than "in" list in python
示例:
from timeit import timeit
print(timeit("5 in [i for i in range(0, 100)]"))
print(timeit("5 in map(int, range(0, 100))"))
这是结果:
3.771566713000084
0.9066896029999043
python 3.8.5(而且我认为这没有参考 python 版本 ^_^)
生成器表达式比列表理解好得多。
遍历生成器表达式或列表理解会做同样的事情。然而,列表理解将首先在内存中创建整个列表,而生成器表达式将动态创建项目,因此您可以将它用于非常大甚至无限的序列
map
上的 in
(从技术上讲,它是迭代器,而不是生成器;生成器是使用 yield
或生成器表达式的函数,它们是更广泛的 class 迭代器)一旦知道结果为 True
就会短路,因此它实际上只产生并检查六个值,然后立即 returns True
.相比之下,list
理解必须生成 100 个元素的全部 list
,然后再检查其中任何一个。
如果你的测试是针对一个不在所讨论的可迭代对象中的元素,map
获胜(如果有的话)(对 int
的无意义调用会伤害它,性能方面) , 会更小,但是当 iterable 包含元素,并且它在 iterable 的早期,短路显然更快,即使每个元素的生产成本更高,因为它产生的元素少得多。
示例:
from timeit import timeit
print(timeit("5 in [i for i in range(0, 100)]"))
print(timeit("5 in map(int, range(0, 100))"))
这是结果:
3.771566713000084
0.9066896029999043
python 3.8.5(而且我认为这没有参考 python 版本 ^_^)
生成器表达式比列表理解好得多。
遍历生成器表达式或列表理解会做同样的事情。然而,列表理解将首先在内存中创建整个列表,而生成器表达式将动态创建项目,因此您可以将它用于非常大甚至无限的序列
map
上的 in
(从技术上讲,它是迭代器,而不是生成器;生成器是使用 yield
或生成器表达式的函数,它们是更广泛的 class 迭代器)一旦知道结果为 True
就会短路,因此它实际上只产生并检查六个值,然后立即 returns True
.相比之下,list
理解必须生成 100 个元素的全部 list
,然后再检查其中任何一个。
如果你的测试是针对一个不在所讨论的可迭代对象中的元素,map
获胜(如果有的话)(对 int
的无意义调用会伤害它,性能方面) , 会更小,但是当 iterable 包含元素,并且它在 iterable 的早期,短路显然更快,即使每个元素的生产成本更高,因为它产生的元素少得多。