而不会造成额外的开销用的设置的
range对象,并使用
all具有测试 感实性
每一个项目,你可以使用
itertools.islice推动发电机
n提前步骤,然后返回
下一个 切片项目,如果切片存在或默认
False,如果不:
from itertools import islicedef check_list(lst, x, n): gen = (True for i in lst if i==x) return next(islice(gen, n-1, None), False)
注意like
list.count,
itertools.islice也以C速度运行。这具有处理非列表的可迭代对象的额外优势。
一些时间:
In [1]: from itertools import isliceIn [2]: from random import randrangeIn [3]: lst = [randrange(1,10) for i in range(100000)]In [5]: %%timeit # using list.index ....: check_list(lst, 5, 1000) ....:1000 loops, best of 3: 736 µs per loopIn [7]: %%timeit # islice ....: check_list(lst, 5, 1000) ....:1000 loops, best of 3: 662 µs per loopIn [9]: %%timeit # using list.index ....: check_list(lst, 5, 10000) ....:100 loops, best of 3: 7.6 ms per loopIn [11]: %%timeit # islice ....: check_list(lst, 5, 10000) ....:100 loops, best of 3: 6.7 ms per loop



