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.