fork(1) download
  1. from itertools import tee, chain, islice, izip
  2. import random
  3. import timeit
  4.  
  5.  
  6. def prev_cur_next_1(sequence):
  7. index = 0
  8. while index < len(sequence):
  9. yield (sequence[index - 1] if index else None,
  10. sequence[index],
  11. sequence[index + 1] if index + 1 < len(sequence) else None)
  12. index += 1
  13. raise StopIteration
  14.  
  15.  
  16. def prev_cur_next_2(list_arg):
  17. extended_list = [None]
  18. extended_list.extend(list_arg)
  19. extended_list.append(None)
  20. return (extended_list[i - 1:i + 2] for i in xrange(1, len(extended_list) - 1))
  21.  
  22.  
  23. def prev_cur_next_3(some_iterable):
  24. prevs, items, nexts = tee(some_iterable, 3)
  25. prevs = chain([None], prevs)
  26. nexts = chain(islice(nexts, 1, None), [None])
  27. return izip(prevs, items, nexts)
  28.  
  29.  
  30. def prev_cur_next_4(seq):
  31. return izip(chain([None], seq), seq, chain(islice(seq, 1, None), [None]))
  32.  
  33.  
  34. data = [random.random() for i in xrange(1000000)]
  35.  
  36. samples = [prev_cur_next_1, prev_cur_next_2, prev_cur_next_3, prev_cur_next_4]
  37.  
  38. for sample_fx in samples:
  39. interval = timeit.timeit(lambda: list(sample_fx(data)), number=1)
  40. print '%s executed in %.3f seconds' % (sample_fx, interval)
  41.  
Success #stdin #stdout 2.34s 27568KB
stdin
Standard input is empty
stdout
<function prev_cur_next_1 at 0xb730a41c> executed in 0.971 seconds
<function prev_cur_next_2 at 0xb730a224> executed in 0.524 seconds
<function prev_cur_next_3 at 0xb730a684> executed in 0.230 seconds
<function prev_cur_next_4 at 0xb730a6bc> executed in 0.213 seconds