import gc
from itertools import groupby
from genshi.template.base import Context
from genshi.template.eval import Expression

expr2 = Expression("say")
expr1 = Expression("iter(groupby(test, key=lambda x: len(x)))")

def run(**data):
    ctxt = Context(**data)
    for i, j in expr1.evaluate(ctxt):
        ctxt.push(dict(i=i, j=j))
        yield expr2.evaluate(ctxt)
        ctxt.pop()

i = 2
while i:
    gc.collect()
    num_objects = len(gc.get_objects())
    try:
        list(run(test=dict.fromkeys(map(str, range(10, 100))), groupby=groupby))
    except Exception, e:
        print e
    i -= 1 # 2 passes needed for reaching fix-point

# check the memory usage again
gc.collect()
print num_objects, len(gc.get_objects())
