flatten a level one list

Michael Spencer mahs at telcopartners.com
Wed Jan 11 22:14:03 EST 2006

 > Robin Becker schrieb:
 >> Is there some smart/fast way to flatten a level one list using the
 >> latest iterator/generator idioms.

David Murmann wrote:
 > Some functions and timings

Here are some more timings of David's functions, and a couple of additional 
contenders that time faster on my box  (I don't have psyco):

# From David Murman
from itertools import izip

xdata = range(1000)
ydata = range(1000)[::-1]

def flatten1(x, y):
     return [i for pair in izip(x, y) for i in pair]

def flatten2(x, y):
     return [i for pair in zip(x, y) for i in pair]

def flatten3(x, y):
     res = []
     for pair in izip(x, y):
         for i in pair:
     return res

# New attempts:
from itertools import imap
def flatten4(x, y):
     l = []
     list(imap(l.extend, izip(x, y)))
     return l

from Tkinter import _flatten
def flatten5(x, y):
     return list(_flatten(zip(x, y)))

flatten_funcs = [flatten1, flatten2, flatten3, flatten4, flatten5]

def testthem():
     flatten1res = flatten_funcs[0](xdata, ydata)
     for func in flatten_funcs:
         assert func(xdata, ydata) == flatten1res

def timethem():
     for func in flatten_funcs:
         print shell.timefunc(func, xdata, ydata)

  >>> testthem()
  >>> timethem()
  flatten1(...)  704 iterations, 0.71msec per call
  flatten2(...)  611 iterations, 0.82msec per call
  flatten3(...)  344 iterations, 1.46msec per call
  flatten4(...)  1286 iterations, 389.08usec per call
  flatten5(...)  1219 iterations, 410.24usec per call


More information about the Python-list mailing list