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> -- http://mail.python.org/mailman/listinfo/python-list