Virtual iterators #392
Replies: 3 comments 1 reply
-
I suppose this would only be useful if the sequence is a list or tuple? (Or perhaps some other builtin sequence like str.) Not for a user-defined Sequence subclass, we wouldn't be able to prove that |
Beta Was this translation helpful? Give feedback.
-
Yes, the main benefit would be for builtin sequences. |
Beta Was this translation helpful? Give feedback.
-
How would this work for situations like this? it = iter(list(range(20)))
next(it)
next(it)
for i in it:
if i > 5:
next(it)
if i > 10:
break
next(it)
next(it) |
Beta Was this translation helpful? Give feedback.
-
Much like we have "virtual bound-methods" for calls to methods, we could have "virtual iterators" for iteration over sequences.
The
LOAD_METHOD
instruction pushesNULL func
orfunc self
to the stack, the latter being a representation of the bound-methodtypes.MethodType(func, self)
.We could do something similar for
GET_ITER
.For non-sequence iterators, like range, generators etc, it would push
NULL iter
. For sequences, it would pushseq 0
.The behavior of
FOR_ITER
would depend on whetherSECOND
isNULL
.NULL
: Pushnext(iter)
NULL
: Pop index; pushindex+1
; pushseq[index]
If we allow unboxed integers on the stack, then this could be reasonably efficient with specialization.
For this to be useful, we would need have tagged integers on the stack.
I doubt it would be worth implementing tagged ints just for this, but if we had tagged values for another reason, e.g. deferred reference counts, then it could be a worthwhile enhancement.
Beta Was this translation helpful? Give feedback.
All reactions