之前,我试图回答一个问题,想要尽可能高效地迭代一个列表切片。
for x in lst[idx1:]:
由于它创建了一个副本(一般来说,这是 O(n)),因此并不理想。我的下一个想法是使用 itertools.islice
。但是,如果你查看文档,会发现 islice
会调用 next
直到找到它要查找的索引位置,然后开始生成值。这也是 O(n)。似乎有一种优化可以用于传递给 islice
的对象是 list
或 tuple
的情况——似乎可以直接(在 C 中)迭代“切片”,而不必实际制作副本。我很好奇这个优化是否已经在 源代码 中实现,但我没有找到任何信息。我对 C 和 Python 源代码树并不十分熟悉,所以完全有可能我错过了。
我的问题是:
是否有一种方法可以在一个被优化的 C 实现中迭代列表“切片”而不制作列表“切片”的副本并且不浪费一堆不需要的元素?
我很清楚我可以为此编写自己的生成器(非常简单,没有考虑到许多参数应该是可选的等等):
def myslice(obj,start,stop,stride):
for i in xrange(start,stop,stride):
yield obj[i]
但是这肯定无法打败经过优化的C实现。
如果你想知道为什么我需要这个,而不只是直接循环遍历一个切片,请考虑以下区别:
takewhile(lambda x: x == 5, lst[idx:]) #copy's the tail of the list unnecessarily
与
takewhile(lambda x: x == 5, islice(lst,idx,None)) #inspects the head of the list unnecessarily
最后:
takewhile(lambda x: x == 5, magic_slice(lst,idx,None)) #How to create magic_slice???