Created
November 7, 2012 10:08
-
-
Save mooz/4030638 to your computer and use it in GitHub Desktop.
Lazy array
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class LazyArray(object): | |
""" | |
Wraps an iterable object and provides lazy array functionality, | |
namely, lazy index access and iteration. Lazily got iteration | |
results are cached and reused to provide consistent view | |
for users. | |
""" | |
def __init__(self, iterable_source): | |
self.source = iterable_source | |
self.got_elements = [] | |
self.read_count = 0 | |
def __iter__(self): | |
# yield cached result | |
for elem in self.got_elements: | |
yield elem | |
# get results from iterable object | |
for elem in self.source: | |
self.read_count = self.read_count + 1 | |
self.got_elements.append(elem) | |
yield elem | |
def __getitem__(self, idx): | |
# if element corresponds to specified index is not available, | |
# get lacking results from iterable object | |
from itertools import islice | |
needed_read_count = max(idx - self.read_count + 1, 0) | |
for elem in islice(self.source, 0, needed_read_count): | |
self.read_count = self.read_count + 1 | |
self.got_elements.append(elem) | |
return self.got_elements[idx] | |
if __name__ == "__main__": | |
def getnumbers(n): | |
for x in xrange(1, n): | |
print("yield " + str(x)) | |
yield x | |
larray = LazyArray(getnumbers(20)) | |
print("larray[7]: %d" % larray[7]) | |
for idx, x in enumerate(larray): | |
print("larray[%d]: %d" % (idx, x)) | |
print("larray[10]: %d" % larray[10]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment