Friday, September 23, 2011

Python: Schneller als dict.get()

Um einen Wert aus einem Dictionary zu holen aber beim Fehlen des Schluessels einen Standardwert zurueck zu geben, benutz man die get()-Methode des Dictionarys.

>>> d = {}
>>> v1 = d.get('k1', False)

In Laufzeitkritischen Situation ist aber die Verwendung des 'in' Operators in Verbindung mit der bedingten Zuweisung (var = <true_val> if <condition> else <false_val>) zu empfehlen.

>>> d = {}
>>> v1 = d['k1'] if 'k1' in d else False

Diese Variante ist mehr als doppelt so schnell. Ein Grund dafuer ist, dass kein neuer Stackframe (wie beim Aufruf der Methode) initialisiert werden muss.

>>> from timeit import repeat
>>> # using in-operator, key exists
... repeat("v1 = d['k1'] if 'k1' in d else False","d = {'k1':1,'k2':2,'k3':3}")
[0.07450103759765625, 0.07420086860656738, 0.08083891868591309]
>>> # using in-operator, key does not exist
... repeat("v1 = d['k1'] if 'k1' in d else False","d = {'k2':2,'k3':3}")
[0.0692899227142334, 0.07552504539489746, 0.06921982765197754]
>>> # using get-method, key exists
... repeat("v1 = d.get('k1', False)","d = {'k1':1,'k2':2,'k3':3}")
[0.17818498611450195, 0.17094182968139648, 0.1709129810333252]
>>> # using get-method, key does not exist
... repeat("v1 = d.get('k1', False)","d = {'k2':2,'k3':3}")
[0.1866598129272461, 0.17163419723510742, 0.1735219955444336]

0 comments:

Post a Comment