Doppelte Zeilen entfernen

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
BlackJack

@Hyperion: Ich vermute mal ganz stark das liegt an der Implementierung weil bei einem ``a[x] = x`` der Compiler schon erkennen kann welche Methode hier aufgerufen wird, im Gegensatz zu ``a.add(x)`` wo wahrscheinlich tatsächlich erst einmal, und jedes mal, die `add()`-Methode vom Objekt abgefragt wird. Wenn man sich das mal als Bytecodes anschaut:

Code: Alles auswählen

In [1]: def f():
   ...:     a[x] = x
   ...:     b.add(x)
   ...: 

In [2]: import dis

In [3]: dis.dis(f)
  2           0 LOAD_GLOBAL              0 (x)
              3 LOAD_GLOBAL              1 (a)
              6 LOAD_GLOBAL              0 (x)
              9 STORE_SUBSCR        

  3          10 LOAD_GLOBAL              2 (b)
             13 LOAD_ATTR                3 (add)
             16 LOAD_GLOBAL              0 (x)
             19 CALL_FUNCTION            1
             22 POP_TOP             
             23 LOAD_CONST               0 (None)
             26 RETURN_VALUE 
Würde ich also als Implementierungsdetail ansehen: Bei anderen Implementierungen könnte die Attributzuweisung langsamer sein wenn sie nicht als Sonderfall behandelt wird, und andererseits könnte ich mir vorstellen, dass eine Implementierung den zweiten Fall auch optimieren könnte.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

BlackJack hat geschrieben:@Hyperion: Ich vermute mal ganz stark das liegt an der Implementierung weil bei einem ``a[x] = x`` der Compiler schon erkennen kann welche Methode hier aufgerufen wird, im Gegensatz zu ``a.add(x)`` wo wahrscheinlich tatsächlich erst einmal, und jedes mal, die `add()`-Methode vom Objekt abgefragt wird.
Ja, daran sollte es liegen. Wird die Auflösung von add herausgezogen

Code: Alles auswählen

def unique_with_set_2(test):
    seen = set()
    result = list()
    add = seen.add
    for item in test:
        if item not in seen:
            result.append(item)
            add(item)
    return result
so sind die Zeiten fast identisch:

Code: Alles auswählen

In [2]: timeit unique_with_set_2(test)
10000 loops, best of 3: 40.7 µs per loop

In [3]: timeit unique_with_dict_2(test)
10000 loops, best of 3: 40.8 µs per loop
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@/me
`OrderedDict` hatte ich anfangs auch gleich im Sinn, war aber wie Du vermutest von der Performance unter ferner liefen...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten