Skip to content

Instantly share code, notes, and snippets.

@mooz
Created November 7, 2012 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mooz/4030638 to your computer and use it in GitHub Desktop.
Save mooz/4030638 to your computer and use it in GitHub Desktop.
Lazy array
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