import timeit
import __main__
from cStringIO import StringIO
from itertools import chain, repeat, takewhile
from copy import copy
N = 1000 #Number of executions
L = 1000 #Length of initial list
stringio = "StringIO('1'*L+'Z111')"
def test_f_iter_plus_Z():
stringio_loc = eval(stringio)
i = takewhile(lambda x: x!='',iter(lambda: stringio_loc.read(1),'Z'))
buf = ''.join(i) + 'Z'
def test_f_iter_chain():
stringio_loc = eval(stringio)
i = takewhile(lambda x: x!='',iter(lambda: stringio_loc.read(1),'Z'))
i = chain(i,repeat('Z',1))
buf = ''.join(i)
def take_until_included(stringio_loc):
for s in iter(lambda: stringio_loc.read(1),''):
yield s
if s=='Z':
return
def test_f_generator():
stringio_loc = eval(stringio)
i = take_until_included(stringio_loc)
buf = ''.join(i)
def test_f_chunks():
stringio_loc = eval(stringio)
datalist = []
for chunk in iter(lambda: stringio_loc.read(256),''):
if 'Z' not in chunk:
datalist.append(chunk)
else:
datalist.append(chunk[:chunk.find('Z')+1])
break
return ''.join(datalist)
def test_f_chunks_generator():
stringio_loc = eval(stringio)
def gen():
for chunk in iter(lambda: stringio_loc.read(256),''):
if 'Z' not in chunk:
yield chunk
else:
yield chunk[:chunk.find('Z')+1]
break
return ''.join(gen())
names = dir(__main__)
for name in names:
attr = getattr(__main__,name)
if hasattr(attr,'__call__'):
if name.startswith('test_f_'):
init_name = name + '_init'
if hasattr(__main__, init_name):
init = getattr(__main__,init_name)
else:
init = 'from __main__ import {name}; from cStringIO import StringIO;'.format(name=name)
t = timeit.Timer(stmt='{name}()'.format(name=name),
setup=init)
time = t.timeit(N)
print('{name}: {time}'.format(name=name,time=time))
aW1wb3J0IHRpbWVpdAppbXBvcnQgX19tYWluX18KZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiwgcmVwZWF0LCB0YWtld2hpbGUKZnJvbSBjb3B5IGltcG9ydCBjb3B5CgoKTiA9IDEwMDAgI051bWJlciBvZiBleGVjdXRpb25zCkwgPSAxMDAwICNMZW5ndGggb2YgaW5pdGlhbCBsaXN0CnN0cmluZ2lvID0gIlN0cmluZ0lPKCcxJypMKydaMTExJykiCgoKZGVmIHRlc3RfZl9pdGVyX3BsdXNfWigpOgogICAgc3RyaW5naW9fbG9jID0gZXZhbChzdHJpbmdpbykKICAgIGkgPSB0YWtld2hpbGUobGFtYmRhIHg6IHghPScnLGl0ZXIobGFtYmRhOiBzdHJpbmdpb19sb2MucmVhZCgxKSwnWicpKQogICAgYnVmID0gJycuam9pbihpKSArICdaJwoKCmRlZiB0ZXN0X2ZfaXRlcl9jaGFpbigpOgogICAgc3RyaW5naW9fbG9jID0gZXZhbChzdHJpbmdpbykKICAgIGkgPSB0YWtld2hpbGUobGFtYmRhIHg6IHghPScnLGl0ZXIobGFtYmRhOiBzdHJpbmdpb19sb2MucmVhZCgxKSwnWicpKQogICAgaSA9IGNoYWluKGkscmVwZWF0KCdaJywxKSkKICAgIGJ1ZiA9ICcnLmpvaW4oaSkKCgpkZWYgdGFrZV91bnRpbF9pbmNsdWRlZChzdHJpbmdpb19sb2MpOgogICAgZm9yIHMgaW4gaXRlcihsYW1iZGE6IHN0cmluZ2lvX2xvYy5yZWFkKDEpLCcnKToKICAgICAgICB5aWVsZCBzCiAgICAgICAgaWYgcz09J1onOgogICAgICAgICAgICByZXR1cm4KCgpkZWYgdGVzdF9mX2dlbmVyYXRvcigpOgogICAgc3RyaW5naW9fbG9jID0gZXZhbChzdHJpbmdpbykKICAgIGkgPSB0YWtlX3VudGlsX2luY2x1ZGVkKHN0cmluZ2lvX2xvYykKICAgIGJ1ZiA9ICcnLmpvaW4oaSkKCgpkZWYgdGVzdF9mX2NodW5rcygpOgogICAgc3RyaW5naW9fbG9jID0gZXZhbChzdHJpbmdpbykKICAgIGRhdGFsaXN0ID0gW10KICAgIGZvciBjaHVuayBpbiBpdGVyKGxhbWJkYTogc3RyaW5naW9fbG9jLnJlYWQoMjU2KSwnJyk6CiAgICAgICAgaWYgJ1onIG5vdCBpbiBjaHVuazoKICAgICAgICAgICAgZGF0YWxpc3QuYXBwZW5kKGNodW5rKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRhdGFsaXN0LmFwcGVuZChjaHVua1s6Y2h1bmsuZmluZCgnWicpKzFdKQogICAgICAgICAgICBicmVhawogICAgcmV0dXJuICcnLmpvaW4oZGF0YWxpc3QpCiAgIAogCmRlZiB0ZXN0X2ZfY2h1bmtzX2dlbmVyYXRvcigpOgogICAgc3RyaW5naW9fbG9jID0gZXZhbChzdHJpbmdpbykKICAgIGRlZiBnZW4oKTogCiAgICAgICAgZm9yIGNodW5rIGluIGl0ZXIobGFtYmRhOiBzdHJpbmdpb19sb2MucmVhZCgyNTYpLCcnKToKICAgICAgICAgICAgaWYgJ1onIG5vdCBpbiBjaHVuazoKICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCBjaHVua1s6Y2h1bmsuZmluZCgnWicpKzFdCiAgICAgICAgICAgICAgICBicmVhawogICAgcmV0dXJuICcnLmpvaW4oZ2VuKCkpICAKCiAgIApuYW1lcyA9IGRpcihfX21haW5fXykKZm9yIG5hbWUgaW4gbmFtZXM6CiAgICBhdHRyID0gZ2V0YXR0cihfX21haW5fXyxuYW1lKQogICAgaWYgaGFzYXR0cihhdHRyLCdfX2NhbGxfXycpOgogICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgndGVzdF9mXycpOgogICAgICAgICAgICBpbml0X25hbWUgPSBuYW1lICsgJ19pbml0JwogICAgICAgICAgICBpZiBoYXNhdHRyKF9fbWFpbl9fLCBpbml0X25hbWUpOgogICAgICAgICAgICAgICAgaW5pdCA9IGdldGF0dHIoX19tYWluX18saW5pdF9uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaW5pdCA9ICdmcm9tIF9fbWFpbl9fIGltcG9ydCB7bmFtZX07IGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTzsnLmZvcm1hdChuYW1lPW5hbWUpCiAgICAgICAgICAgIHQgPSB0aW1laXQuVGltZXIoc3RtdD0ne25hbWV9KCknLmZvcm1hdChuYW1lPW5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwPWluaXQpCgogICAgICAgICAgICB0aW1lID0gdC50aW1laXQoTikKICAgICAgICAgICAgcHJpbnQoJ3tuYW1lfToge3RpbWV9Jy5mb3JtYXQobmFtZT1uYW1lLHRpbWU9dGltZSkp