Well, that was a nice explanation. Thanks once again Kent! Bernard
On 5/16/05, Kent Johnson <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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@python.org > >>http://mail.python.org/mailman/listinfo/tutor > >> > > > > _______________________________________________ > > Tutor maillist - Tutor@python.org > > http://mail.python.org/mailman/listinfo/tutor > > > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor