嵌套过滤器的工作原理是什么?

时间:2016-07-22 19:47:36

标签: python python-3.x

我想我不完全理解嵌套过滤器的工作原理。

我已经创建了高度嵌套(并且略显愚蠢)的过滤器对象:

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

引擎盖下的内容是什么?这是怎么回事?我会对创造这一点的内在工作有一些解释。

1 个答案:

答案 0 :(得分:2)

第一次迭代必须应用大约5000万个谓词测试来拒绝前10,000个元素,因此需要很长时间。之后的每次迭代只需要应用1万个测试来接受下一个元素,因此它们的速度提高了大约5000倍。您在以后的迭代之间看到的变化只是噪声;它并不重要。