早些时候,我试图回答一个问题,我想尽可能高效地迭代列表切片。
for x in lst[idx1:]:
不理想,因为它创建了一个副本(通常,这是O(n)
)。我的下一个想法是使用itertools.islice
. 但是,如果您查看文档,它似乎islice
会调用next
,直到找到它正在寻找的索引,此时它将开始产生值。这也是O(n)
。islice
如果传递给的对象是 alist
或 a ,这里似乎有一个可用的优化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???