Fredrik Lundh wrote: > Sion Arrowsmith wrote: > > >>>(you cannot really use "profile" to *benchmark* things written in Python >>>either; the >>>profiler tells you where a given program spends the time, not how fast it is >>>in com- >>>parision with other programs) >> >>Hmm. Playing around with timeit suggests that although split() *is* >>faster than split("\t"), it's fractional, rather than the OP's four >>times faster. Is the overhead of profile keeping track of calls in >>Python getting in the way? > > > correct. > > >>And why can map() keep everything at the C level when the list com- > > > prehension can't? > > map is called with two Python objects (the str.split callable and the > sequence object), while the list comprehension is turned into a byte- > code loop that evaluates s.split for each item in the sequence; compare > and contrast: > > >>> def func(a): > .... return map(str.split, a) > .... > >>> dis.dis(func) > 2 0 LOAD_GLOBAL 0 (map) > 3 LOAD_GLOBAL 1 (str) > 6 LOAD_ATTR 2 (split) > 9 LOAD_FAST 0 (a) > 12 CALL_FUNCTION 2 > 15 RETURN_VALUE > > >>> def func(a): > .... return [s.split() for s in a] > .... > >>> dis.dis(func) > 2 0 BUILD_LIST 0 > 3 DUP_TOP > 4 STORE_FAST 1 (_[1]) > 7 LOAD_FAST 0 (a) > 10 GET_ITER > >> 11 FOR_ITER 19 (to 33) > 14 STORE_FAST 2 (s) > 17 LOAD_FAST 1 (_[1]) > 20 LOAD_FAST 2 (s) > 23 LOAD_ATTR 0 (split) > 26 CALL_FUNCTION 0 > 29 LIST_APPEND > 30 JUMP_ABSOLUTE 11 > >> 33 DELETE_FAST 1 (_[1]) > 36 RETURN_VALUE > > (LOAD_GLOBAL and LOAD_ATTR does full name lookups, while LOAD_FAST loads > a local variable using an integer index) > > </F> > Well I guess if people wanted to argue for keeping the functionals this should be on the list ...
regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://holdenweb.blogspot.com Recent Ramblings http://del.icio.us/steve.holden -- http://mail.python.org/mailman/listinfo/python-list