[Tutor] map() and lambda to change class instance attribute (fwd)
Bernard Lebel
3dbernard at gmail.com
Thu May 19 23:33:55 CEST 2005
Well, that was a nice explanation. Thanks once again Kent!
Bernard
On 5/16/05, Kent Johnson <kent37 at tds.net> wrote:
> Bernard Lebel wrote:
> > Hi Kent,
> >
> > So if I undestand you right, mapping a function with map() when it is
> > a built-in function will/may be faster than a for loop, but if it's a
> > custom function (ie. a def one), it will most likely be slower?
>
> I guess I didn't proofread that last mail...what I meant is
>
> - Write the code for clarity first
> - If you find a performance bottleneck then test different solutions to see which is fastest for
> your actual data and usage.
> - Mapping a builtin function over a list is relatively fast in Python and it is worth trying if it
> meets your needs.
> - Calling a function is relatively expensive in Python so if using map() requires you to define a
> helper that may wipe out its advantage.
> - Testing is crucial! Guessing is only good for helping to come up with ideas to test.
>
> Here is a program that tests six ways to apply a function to elements of a list. The functions don't
> create new lists except as side effects since that was the original problem. They use map(), list
> comprehension and an explicit for loop to apply str() or a Python function returning str() to the
> elements of a list. (The list already contains strings so the actual function call should be fast.)
>
> ####
>
> import timeit
>
> data = [str(n) for n in range(100)]
>
> def strByMap():
> map(str, data)
>
> def strByListComp():
> [str(n) for n in data]
>
> def strByLoop():
> for n in data:
> str(n)
>
>
> def func(x):
> return str(x)
>
>
> def funcByMap():
> map(func, data)
>
> def funcByListComp():
> [func(n) for n in data]
>
> def funcByLoop():
> for n in data:
> func(n)
>
>
> def timeOne(fn):
> setup = "from __main__ import " + fn.__name__
> stmt = '%s()' % (fn.__name__)
>
> t = timeit.Timer(stmt, setup)
> secs = min(t.repeat(number=1000))
> print '%15s %s' % (fn.__name__, secs)
>
> for fn in [ strByMap, strByListComp, strByLoop, funcByMap, funcByListComp, funcByLoop ]:
> timeOne(fn)
>
> ###
>
> Here are the results on my computer:
>
> strByMap 0.0359623918682
> strByListComp 0.0581065470611
> strByLoop 0.0481150537289
> funcByMap 0.0810943849009
> funcByListComp 0.0891375859222
> funcByLoop 0.0806144356336
>
> So for this test, map is fastest when calling a builtin and explicit looping is fastest when calling
> a function. With the explicit loop you might be able to inline the function, in which case it would
> be much faster than either map or list comp.
>
> Modifying the program slightly so that each function actually creates a list changes the results
> dramatically:
> strByMap 0.0365733633744
> strByListComp 0.0579948010152
> strByLoop 0.0764722890758
> funcByMap 0.0811885309446
> funcByListComp 0.0883995032888
> funcByLoop 0.10586876265
>
> Now map() is fastest in both cases, though a for loop with inlined code beats map() with an external
> function.
>
> Kent
> >
> >
> > Thanks
> > Bernard
> >
> >
> > On 5/13/05, Kent Johnson <kent37 at tds.net> wrote:
> >
> >>Bernard Lebel wrote:
> >>
> >>>The authors even go as far as saysing, on page 228 (first paragraph)
> >>>that map() used that way has a performance benefit and is faster than
> >>>a for loop.
> >>
> >>That may well be correct, at least in the case where the function passed to map is a builtin.
> >>Mapping a builtin to over a list is extremely fast. So write the code with a for loop so it is
> >>clear. When you identify a performance bottleneck you can try rewriting your loop using map or list
> >>comprehension, which is also fast. Until then it is premature optimization. For typical loops over a
> >>small number of items I can't imagine you would notice the difference.
> >>
> >>Kent
> >>
> >>_______________________________________________
> >>Tutor maillist - Tutor at python.org
> >>http://mail.python.org/mailman/listinfo/tutor
> >>
> >
> > _______________________________________________
> > Tutor maillist - Tutor at python.org
> > http://mail.python.org/mailman/listinfo/tutor
> >
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list