Seite 1 von 1
list comprehensions
Verfasst: Freitag 26. August 2011, 13:44
von ni-ko-o-kin
hallo!
weiß jemand wieso list comprehensions so schnell sind?
Code: Alles auswählen
# list comprehension
meineliste = [i for i in range(10**6)]
# for-schleife, append
meineliste = []
for i in range(10**6):
meineliste.append(i)
mir ist klar das ich bei zweiterem die methode append 10**6 aufrufen muss und dass das lange dauert. aber wieso kommen die list comprehensions ohne diese vielen calls aus?
edit: hab 1000000 auf 10**6 auf grund der lesbarkeit geändert
grüße,
niko
.
Re: list comprehensions
Verfasst: Freitag 26. August 2011, 13:52
von EyDu
Hallo.
Das kannst du am Byte-Code ganz gut erkennen:
Code: Alles auswählen
>>> def lc():
... meineliste = [i for i in range(10**6)]
...
>>> def loop():
... meineliste = []
... for i in range(10**6):
... meineliste.append(i)
...
>>> import dis
>>> dis.dis(lc)
2 0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 3 (1000000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 12 (to 28)
16 STORE_FAST 0 (i)
19 LOAD_FAST 0 (i)
22 LIST_APPEND 2
25 JUMP_ABSOLUTE 13
>> 28 STORE_FAST 1 (meineliste)
31 LOAD_CONST 0 (None)
34 RETURN_VALUE
>>> dis.dis(loop)
2 0 BUILD_LIST 0
3 STORE_FAST 0 (meineliste)
3 6 SETUP_LOOP 33 (to 42)
9 LOAD_GLOBAL 0 (range)
12 LOAD_CONST 3 (1000000)
15 CALL_FUNCTION 1
18 GET_ITER
>> 19 FOR_ITER 19 (to 41)
22 STORE_FAST 1 (i)
4 25 LOAD_FAST 0 (meineliste)
28 LOAD_ATTR 1 (append)
31 LOAD_FAST 1 (i)
34 CALL_FUNCTION 1
37 POP_TOP
38 JUMP_ABSOLUTE 19
>> 41 POP_BLOCK
>> 42 LOAD_CONST 0 (None)
45 RETURN_VALUE
Sebastian
Re: list comprehensions
Verfasst: Freitag 26. August 2011, 14:11
von ni-ko-o-kin
Les mich grad in das dis-module ein. Vielen dank für die schnelle Antwort.