Array of 2^n
Skip Montanaro
skip at pobox.com
Tue Oct 23 09:15:01 EDT 2001
Andreas> Well, at least for python 2.0 (SuSE 7.2) this way [list
Andreas> comprehensions] is also about 25% slower than map/lambda...
Andreas> Has it been sped up in later versions?
Not significantly. List comprehensions are byte compiled to almost the same
code that you would get with the obvious for loop translation. Map(), on
the other hand, is a function, so it gets compiled to a function call
opcode. That means the loop machinery runs in C instead of in the Python
virtual machine.
The Python disassembler is instructive here, and so simple to use, everyone
ought to be familiar with it, even if just to answer these sorts of
questions. Here's how:
1. Define a function which contains the construct you're interested in
examining:
def foo(n):
return [i**2 for i in range(n)]
2. Invoke the python interpreter with the -O flag (avoids those pesky
SET_LINENO instructions in the output).
3. Import both the module containing your function and the dis module:
>>> import foo, dis
4. Disassemble the function:
>>> dis.dis(foo.foo)
0 BUILD_LIST 0
3 DUP_TOP
4 LOAD_ATTR 0 (append)
7 STORE_FAST 1 (_[1])
10 LOAD_GLOBAL 2 (range)
13 LOAD_FAST 0 (n)
16 CALL_FUNCTION 1
19 GET_ITER
>> 20 FOR_ITER 20 (to 43)
23 STORE_FAST 2 (i)
26 LOAD_FAST 1 (_[1])
29 LOAD_FAST 2 (i)
32 LOAD_CONST 1 (2)
35 BINARY_POWER
36 CALL_FUNCTION 1
39 POP_TOP
40 JUMP_ABSOLUTE 20
>> 43 DELETE_FAST 1 (_[1])
46 RETURN_VALUE
47 LOAD_CONST 0 (None)
50 RETURN_VALUE
repeat-as-necessary-ly, y'rs,
--
Skip Montanaro (skip at pobox.com)
http://www.mojam.com/
http://www.musi-cal.com/
More information about the Python-list
mailing list