Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Re: list comprehension question

Reply
Thread Tools

Re: list comprehension question

 
 
Dave Angel
Guest
Posts: n/a
 
      10-17-2012
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.
>

(Please don't top-post; it ruins the ordering. In these forums, put
your response after the part you quote from earlier messages. Or even
better, after each part you quote. Then trim off the parts you didn't
reference.)

list comprehensions CAN be much faster, but not necessarily. The most
complex a loop, the less likely it'll help much.

In any case, only the inner loop will be affected. Nesting two list
comprehensions will make a trivial difference.

On the other hand, Hans Mulder shows some other factoring which seems
much more readable than yours.

Studying (and testing) those could teach you a lot about comprehensions,
as well as about the libraries that can help. Note especially what
zip(*b) yields, and think about what it means.


--

DaveA
 
Reply With Quote
 
 
 
 
rusi
Guest
Posts: n/a
 
      10-17-2012
On Oct 17, 5:33*pm, Dave Angel <(E-Mail 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.


One-lining 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]

# One-liner (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
 
Reply With Quote
 
 
 
 
rusi
Guest
Posts: n/a
 
      10-17-2012
On Oct 17, 7:06*pm, rusi <(E-Mail Removed)> wrote:
> On Oct 17, 5:33*pm, Dave Angel <(E-Mail 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.

>
> One-lining 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]
>
> # One-liner (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)]
 
Reply With Quote
 
Dave Angel
Guest
Posts: n/a
 
      10-17-2012
On 10/17/2012 10:06 AM, rusi wrote:
> On Oct 17, 5:33 pm, Dave Angel <(E-Mail 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.

> One-lining 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]
>
> # One-liner (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


And I'd wager all the improvement is in the inner loop, the dot() function.


--

DaveA

 
Reply With Quote
 
88888 Dihedral
Guest
Posts: n/a
 
      10-17-2012
Dave Angel於 2012年10月17日星期三UTC+8下午10時37分01 寫道:
> On 10/17/2012 10:06 AM, rusi wrote:
>
> > On Oct 17, 5:33 pm, Dave Angel <(E-Mail Removed)> wrote:

>
> >> On 10/17/2012 12:43 AM, Kevin Anthony wrote:> Is it not true that listcomprehension 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.

>
> > One-lining 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]

>
> >

>
> > # One-liner (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

>
>
>
> And I'd wager all the improvement is in the inner loop, the dot() function.
>
>
>
>
>
> --
>
>
>
> DaveA


Thanks for the tips of matrix operations over some fields or rings
other than the real field and the complex field.
 
Reply With Quote
 
88888 Dihedral
Guest
Posts: n/a
 
      10-17-2012
Dave Angel於 2012年10月17日星期三UTC+8下午10時37分01 寫道:
> On 10/17/2012 10:06 AM, rusi wrote:
>
> > On Oct 17, 5:33 pm, Dave Angel <(E-Mail Removed)> wrote:

>
> >> On 10/17/2012 12:43 AM, Kevin Anthony wrote:> Is it not true that listcomprehension 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.

>
> > One-lining 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]

>
> >

>
> > # One-liner (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

>
>
>
> And I'd wager all the improvement is in the inner loop, the dot() function.
>
>
>
>
>
> --
>
>
>
> DaveA


Thanks for the tips of matrix operations over some fields or rings
other than the real field and the complex field.
 
Reply With Quote
 
rusi
Guest
Posts: n/a
 
      10-17-2012
On Oct 17, 7:37*pm, Dave Angel <(E-Mail Removed)> wrote:

> And I'd wager all the improvement is in the inner loop, the dot() function.


Sorry -- red herring!

Changing

def mm1(a,b): return [[sum(x*y for x,y in zip(ra,rb)) for rb in
zip(*b)] for ra in a]

to

def mm1(a,b): return [[sum([x*y for x,y in zip(ra,rb)]) for rb in
zip(*b)] for ra in a]

makes the speed diff vanish
 
Reply With Quote
 
88888 Dihedral
Guest
Posts: n/a
 
      10-17-2012
rusi於 2012年10月17日星期三UTC+8下午10時50分11 寫道:
> On Oct 17, 7:37*pm, Dave Angel <(E-Mail Removed)> wrote:
>
>
>
> > And I'd wager all the improvement is in the inner loop, the dot() function.

>
>
>
> Sorry -- red herring!
>
>
>
> Changing
>
>
>
> def mm1(a,b): return [[sum(x*y for x,y in zip(ra,rb)) for rb in
>
> zip(*b)] for ra in a]
>
>
>
> to
>
>
>
> def mm1(a,b): return [[sum([x*y for x,y in zip(ra,rb)]) for rb in
>
> zip(*b)] for ra in a]
>
>
>
> makes the speed diff vanish


I think a lot people don't work on computations over
fields other real and complex.

That is why a lot people keep complaining about the speeds
of python programs executed.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
List comprehension in if clause of another list comprehension Vedran Furac( Python 4 12-19-2008 01:35 PM
Appending a list's elements to another list using a list comprehension Debajit Adhikary Python 17 10-18-2007 06:45 PM
List comprehension returning subclassed list type? Shane Geiger Python 4 03-25-2007 09:34 AM
[Newby question] List comprehension Eelco Hoekema Python 7 08-06-2004 04:20 PM
List Comprehension question Mark Elston Python 1 12-11-2003 03:54 AM



Advertisments