from itertools import tee, chain, islice, izip
import random
import timeit
def prev_cur_next_1( sequence) :
index = 0
while index < len ( sequence) :
yield ( sequence[ index - 1 ] if index else None ,
sequence[ index] ,
sequence[ index + 1 ] if index + 1 < len ( sequence) else None )
index += 1
raise StopIteration
def prev_cur_next_2( list_arg) :
extended_list = [ None ]
extended_list.extend ( list_arg)
extended_list.append ( None )
return [ extended_list[ i - 1 :i + 2 ] for i in xrange ( 1 , len ( extended_list) - 1 ) ]
def prev_cur_next_3( some_iterable) :
prevs, items, nexts = tee( some_iterable, 3 )
prevs = chain( [ None ] , prevs)
nexts = chain( islice( nexts, 1 , None ) , [ None ] )
return izip( prevs, items, nexts)
def prev_cur_next_4( seq) :
return zip ( chain( [ None ] , seq) , seq, chain( islice( seq, 1 , None ) , [ None ] ) )
data = [ random .random ( ) for i in xrange ( 1000000 ) ]
samples = [ prev_cur_next_1, prev_cur_next_2, prev_cur_next_3, prev_cur_next_4]
for sample_fx in samples:
interval = timeit .timeit ( lambda : list ( sample_fx( data) ) , number= 1 )
print '%s executed in %.3f seconds' % ( sample_fx, interval)
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHRlZSwgY2hhaW4sIGlzbGljZSwgaXppcAppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1laXQKCgpkZWYgcHJldl9jdXJfbmV4dF8xKHNlcXVlbmNlKToKICAgIGluZGV4ID0gMAogICAgd2hpbGUgaW5kZXggPCBsZW4oc2VxdWVuY2UpOgogICAgICAgIHlpZWxkIChzZXF1ZW5jZVtpbmRleCAtIDFdIGlmIGluZGV4IGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgc2VxdWVuY2VbaW5kZXhdLAogICAgICAgICAgICAgICBzZXF1ZW5jZVtpbmRleCArIDFdIGlmIGluZGV4ICsgMSA8IGxlbihzZXF1ZW5jZSkgZWxzZSBOb25lKQogICAgICAgIGluZGV4ICs9IDEKICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCgpkZWYgcHJldl9jdXJfbmV4dF8yKGxpc3RfYXJnKToKICAgIGV4dGVuZGVkX2xpc3QgPSBbTm9uZV0KICAgIGV4dGVuZGVkX2xpc3QuZXh0ZW5kKGxpc3RfYXJnKQogICAgZXh0ZW5kZWRfbGlzdC5hcHBlbmQoTm9uZSkKICAgIHJldHVybiBbZXh0ZW5kZWRfbGlzdFtpIC0gMTppICsgMl0gZm9yIGkgaW4geHJhbmdlKDEsIGxlbihleHRlbmRlZF9saXN0KSAtIDEpXQoKCmRlZiBwcmV2X2N1cl9uZXh0XzMoc29tZV9pdGVyYWJsZSk6CiAgICBwcmV2cywgaXRlbXMsIG5leHRzID0gdGVlKHNvbWVfaXRlcmFibGUsIDMpCiAgICBwcmV2cyA9IGNoYWluKFtOb25lXSwgcHJldnMpCiAgICBuZXh0cyA9IGNoYWluKGlzbGljZShuZXh0cywgMSwgTm9uZSksIFtOb25lXSkKICAgIHJldHVybiBpemlwKHByZXZzLCBpdGVtcywgbmV4dHMpCgoKZGVmIHByZXZfY3VyX25leHRfNChzZXEpOgogICAgcmV0dXJuIHppcChjaGFpbihbTm9uZV0sIHNlcSksIHNlcSwgY2hhaW4oaXNsaWNlKHNlcSwgMSwgTm9uZSksIFtOb25lXSkpCgoKZGF0YSA9IFtyYW5kb20ucmFuZG9tKCkgZm9yIGkgaW4geHJhbmdlKDEwMDAwMDApXQoKc2FtcGxlcyA9IFtwcmV2X2N1cl9uZXh0XzEsIHByZXZfY3VyX25leHRfMiwgcHJldl9jdXJfbmV4dF8zLCBwcmV2X2N1cl9uZXh0XzRdCgpmb3Igc2FtcGxlX2Z4IGluIHNhbXBsZXM6CiAgICBpbnRlcnZhbCA9IHRpbWVpdC50aW1laXQobGFtYmRhOiBsaXN0KHNhbXBsZV9meChkYXRhKSksIG51bWJlcj0xKQogICAgcHJpbnQgJyVzIGV4ZWN1dGVkIGluICUuM2Ygc2Vjb25kcycgJSAoc2FtcGxlX2Z4LCBpbnRlcnZhbCkK