opposite of zip()?
Gary Herron
gherron at islandtraining.com
Sat Dec 15 04:45:30 EST 2007
igor.tatarinov at gmail.com wrote:
> Hi folks,
>
> Thanks, for all the help. I tried running the various options, and
> here is what I found:
>
>
> from array import array
> from time import time
>
> def f1(recs, cols):
> for r in recs:
> for i,v in enumerate(r):
> cols[i].append(v)
>
> def f2(recs, cols):
> for r in recs:
> for v,c in zip(r, cols):
> c.append(v)
>
> def f3(recs, cols):
> for r in recs:
> map(list.append, cols, r)
>
> def f4(recs):
> return zip(*recs)
>
> records = [ tuple(range(10)) for i in xrange(1000000) ]
>
> columns = tuple([] for i in xrange(10))
> t = time()
> f1(records, columns)
> print 'f1: ', time()-t
>
> columns = tuple([] for i in xrange(10))
> t = time()
> f2(records, columns)
> print 'f2: ', time()-t
>
> columns = tuple([] for i in xrange(10))
> t = time()
> f3(records, columns)
> print 'f3: ', time()-t
>
> t = time()
> columns = f4(records)
> print 'f4: ', time()-t
>
> f1: 5.10132408142
> f2: 5.06787180901
> f3: 4.04700708389
> f4: 19.13633203506
>
> So there is some benefit in using map(list.append). f4 is very clever
> and cool but it doesn't seem to scale.
>
> Incidentally, it took me a while to figure out why the following
> initialization doesn't work:
> columns = ([],)*10
> apparently you end up with 10 copies of the same list.
>
Yes. A well known gotcha in Python and a FAQ.
> Finally, in my case the output columns are integer arrays (to save
> memory). I can still use array.append but it's a little slower so the
> difference between f1-f3 gets even smaller. f4 is not an option with
> arrays.
>
More information about the Python-list
mailing list