Seite 1 von 1

Re: Doppelte Zeilen entfernen

Verfasst: Mittwoch 4. Juni 2014, 10:41
von 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.

Re: Doppelte Zeilen entfernen

Verfasst: Mittwoch 4. Juni 2014, 10:55
von EyDu
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

Re: Doppelte Zeilen entfernen

Verfasst: Mittwoch 4. Juni 2014, 11:05
von mutetella
@/me
`OrderedDict` hatte ich anfangs auch gleich im Sinn, war aber wie Du vermutest von der Performance unter ferner liefen...

mutetella