list comprehensions

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ni-ko-o-kin
User
Beiträge: 12
Registriert: Samstag 13. Februar 2010, 10:51

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
.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
ni-ko-o-kin
User
Beiträge: 12
Registriert: Samstag 13. Februar 2010, 10:51

Les mich grad in das dis-module ein. Vielen dank für die schnelle Antwort.
Antworten