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 izip( 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)
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHRlZSwgY2hhaW4sIGlzbGljZSwgaXppcAppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1laXQKCgpkZWYgcHJldl9jdXJfbmV4dF8xKHNlcXVlbmNlKToKICAgIGluZGV4ID0gMAogICAgd2hpbGUgaW5kZXggPCBsZW4oc2VxdWVuY2UpOgogICAgICAgIHlpZWxkIChzZXF1ZW5jZVtpbmRleCAtIDFdIGlmIGluZGV4IGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgc2VxdWVuY2VbaW5kZXhdLAogICAgICAgICAgICAgICBzZXF1ZW5jZVtpbmRleCArIDFdIGlmIGluZGV4ICsgMSA8IGxlbihzZXF1ZW5jZSkgZWxzZSBOb25lKQogICAgICAgIGluZGV4ICs9IDEKICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCgpkZWYgcHJldl9jdXJfbmV4dF8yKGxpc3RfYXJnKToKICAgIGV4dGVuZGVkX2xpc3QgPSBbTm9uZV0KICAgIGV4dGVuZGVkX2xpc3QuZXh0ZW5kKGxpc3RfYXJnKQogICAgZXh0ZW5kZWRfbGlzdC5hcHBlbmQoTm9uZSkKICAgIHJldHVybiAoZXh0ZW5kZWRfbGlzdFtpIC0gMTppICsgMl0gZm9yIGkgaW4geHJhbmdlKDEsIGxlbihleHRlbmRlZF9saXN0KSAtIDEpKQoKCmRlZiBwcmV2X2N1cl9uZXh0XzMoc29tZV9pdGVyYWJsZSk6CiAgICBwcmV2cywgaXRlbXMsIG5leHRzID0gdGVlKHNvbWVfaXRlcmFibGUsIDMpCiAgICBwcmV2cyA9IGNoYWluKFtOb25lXSwgcHJldnMpCiAgICBuZXh0cyA9IGNoYWluKGlzbGljZShuZXh0cywgMSwgTm9uZSksIFtOb25lXSkKICAgIHJldHVybiBpemlwKHByZXZzLCBpdGVtcywgbmV4dHMpCgoKZGVmIHByZXZfY3VyX25leHRfNChzZXEpOgogICAgcmV0dXJuIGl6aXAoY2hhaW4oW05vbmVdLCBzZXEpLCBzZXEsIGNoYWluKGlzbGljZShzZXEsIDEsIE5vbmUpLCBbTm9uZV0pKQoKCmRhdGEgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBpIGluIHhyYW5nZSgxMDAwMDAwKV0KCnNhbXBsZXMgPSBbcHJldl9jdXJfbmV4dF8xLCBwcmV2X2N1cl9uZXh0XzIsIHByZXZfY3VyX25leHRfMywgcHJldl9jdXJfbmV4dF80XQoKZm9yIHNhbXBsZV9meCBpbiBzYW1wbGVzOgogICAgaW50ZXJ2YWwgPSB0aW1laXQudGltZWl0KGxhbWJkYTogbGlzdChzYW1wbGVfZngoZGF0YSkpLCBudW1iZXI9MSkKICAgIHByaW50ICclcyBleGVjdXRlZCBpbiAlLjNmIHNlY29uZHMnICUgKHNhbXBsZV9meCwgaW50ZXJ2YWwpCg==