我想我不完全理解嵌套过滤器的工作原理。
我已经创建了高度嵌套(并且略显愚蠢)的过滤器对象:
L = iter(range(100000))
for i in range(10000):
L = filter(lambda x, i=i: x != i, L)
每个额外的过滤级别只需更多迭代迭代器(实际上是一个项目)。
现在,当我调用此过滤器对象时,我希望每个next
调用都要测试所有嵌套条件。我们怎么知道next
值成功通过所有这些条件?实际上,第一次调用需要很长时间才能执行,但是每次额外的迭代都要短得多:
import time
j = 0
lasttime = time.time()
for x in L:
curtime = time.time()
print(x, curtime - lasttime)
lasttime = curtime
j += 1
if j > 10:
break
结果是:
10000 9.558015823364258
10001 0.0020017623901367188
10002 0.002501964569091797
10003 0.0020017623901367188
10004 0.0025022029876708984
10005 0.0025017261505126953
10006 0.0020020008087158203
10007 0.002001047134399414
10008 0.002501249313354492
10009 0.002002716064453125
10010 0.0
引擎盖下的内容是什么?这是怎么回事?我会对创造这一点的内在工作有一些解释。
答案 0 :(得分:2)
第一次迭代必须应用大约5000万个谓词测试来拒绝前10,000个元素,因此需要很长时间。之后的每次迭代只需要应用1万个测试来接受下一个元素,因此它们的速度提高了大约5000倍。您在以后的迭代之间看到的变化只是噪声;它并不重要。