On Oct 17, 7:06*pm, rusi <(EMail Removed)> wrote:
> On Oct 17, 5:33*pm, Dave Angel <(EMail Removed)> wrote:
>
> > On 10/17/2012 12:43 AM, Kevin Anthony wrote:> Is it not true that list comprehension is much faster the the for loops?
>
> > > If it is not the correct way of doing this, i appoligize.
> > > Like i said, I'm learing list comprehension.
> > list comprehensions CAN be much faster, but not necessarily. *The most
> > complex a loop, the less likely it'll help much.
>
> Onelining the comprehension seems to make a difference of about 10%
> out here. Maybe Ive missed something? Seems too large
>
> # My original suggestion
> def dot(p,q): return sum (x*y for x,y in zip(p,q))
> def transpose(m): return zip(*m)
> def mm(a,b): return mmt(a, transpose(b))
> def mmt(a,b): return [[dot(ra, rb) for rb in b] for ra in a]
>
> # Oneliner (Thanks Hans for reminding me of sum)
>
> def mm1(a,b): return [[sum([x*y for x,y in zip(ra,rb)]) for rb in
> zip(*b)] for ra in a]
>
> >>> t1=Timer("res=mm1(m,m)", setup="from __main__ import mm1, m")
> >>> t1.timeit(1000)
> 12.276363849639893
> >>> t0=Timer("res=mm(m,m)", setup="from __main__ import mm, m")
> >>> t0.timeit(1000)
>
> 13.453603029251099
In case anyone wants to try out with the same data, I used:
m = [range(i,i+30) for i in range(30)]
