Frage

Also lassen Sie uns sagen, ich will ein Wörterbuch machen. Wir nennen es d. Aber es gibt mehr Möglichkeiten, um einen Wörterbuch in Python zu initialisieren! Zum Beispiel könnte ich dies tun:

d = {'hash': 'bang', 'slash': 'dot'}

Oder ich könnte dies tun:

d = dict(hash='bang', slash='dot')

Oder diese seltsame:

d = dict({'hash': 'bang', 'slash': 'dot'})

Oder diese:

d = dict([['hash', 'bang'], ['slash', 'dot']])

Und eine ganze andere Vielzahl von Möglichkeiten, mit der dict() Funktion. So offensichtlich eines der Dinge, dict() bietet, ist Flexibilität in der Syntax und Initialisierung. Aber das ist nicht, was ich zu fragen.

Sagen, dass ich nur ein leeres Wörterbuch machen d war. Was geht hinter den Kulissen des Python-Interpreter auf, wenn ich im Vergleich zu d = {} d = dict() tun? Ist es einfach zwei Möglichkeiten, das Gleiche zu tun? Hat {} verwenden, haben Sie die zusätzliche Aufruf von dict()? Muss man (sogar vernachlässigbar) mehr Aufwand als die anderen? Während die Frage wirklich völlig unwichtig ist, es ist eine Kuriosität Ich würde gerne beantwortet haben.

War es hilfreich?

Lösung

>>> def f():
...     return {'a' : 1, 'b' : 2}
... 
>>> def g():
...     return dict(a=1, b=2)
... 
>>> g()
{'a': 1, 'b': 2}
>>> f()
{'a': 1, 'b': 2}
>>> import dis
>>> dis.dis(f)
  2           0 BUILD_MAP                0
              3 DUP_TOP             
              4 LOAD_CONST               1 ('a')
              7 LOAD_CONST               2 (1)
             10 ROT_THREE           
             11 STORE_SUBSCR        
             12 DUP_TOP             
             13 LOAD_CONST               3 ('b')
             16 LOAD_CONST               4 (2)
             19 ROT_THREE           
             20 STORE_SUBSCR        
             21 RETURN_VALUE        
>>> dis.dis(g)
  2           0 LOAD_GLOBAL              0 (dict)
              3 LOAD_CONST               1 ('a')
              6 LOAD_CONST               2 (1)
              9 LOAD_CONST               3 ('b')
             12 LOAD_CONST               4 (2)
             15 CALL_FUNCTION          512
             18 RETURN_VALUE        

dict () ist anscheinend einige C eingebaut. Eine wirklich intelligente oder engagierte Person (nicht ich) an dem Dolmetscher Quelle aussehen könnte und Ihnen mehr erzählen. Ich wollte nur dis.dis zeigen. :)

Andere Tipps

Was die Leistung geht:

>>> from timeit import timeit
>>> timeit("a = {'a': 1, 'b': 2}")
0.424...
>>> timeit("a = dict(a = 1, b = 2)")
0.889...

@Jacob: Es gibt einen Unterschied, wie die Objekte zugeordnet sind, aber sie sind nicht Copy-on-Write. Python ordnet eine feste Größe „freie Liste“, wo es schnell Dictionary-Objekte zuordnen kann (bis er füllt). Wörterbücher über die {} Syntax zugeordnet (oder eine C Aufruf PyDict_New) kann aus dieser freien Liste kommen. Wenn das Wörterbuch ist nicht mehr referenziert es (obwohl die Felder zurückgesetzt zuerst).

wiederverwendet werden kann, um die freie Liste und dass Speicherblock zurückgegeben wird

Das erste Wörterbuch wird sofort wieder in die freie Liste, und die nächste wird sein Speicherplatz wiederverwendet werden:

>>> id({})
340160
>>> id({1: 2})
340160

Wenn Sie eine Referenz zu halten, ist der nächste Wörterbuch aus dem nächsten freien Slot kommen wird:

>>> x = {}
>>> id(x)
340160
>>> id({})
340016

Aber wir können den Verweis auf dieses Wörterbuch löschen und den Steckplatz wieder frei:

>>> del x
>>> id({})
340160

Da die {} Syntax in Byte-Code behandelt wird, kann es diese Optimierung oben genannten verwenden. Auf der anderen Seite dict() ist wie eine normale Klasse Konstruktor behandelt und Python verwendet das generische Speicherzuordner, das keine leicht vorhersagbaren Muster wie die freie Liste oben folgt.

Auch bei COMPILE.c aus Python sucht 2.6, mit der {} Syntax scheint es, um die Hash-Tabelle vorge Größe auf der Basis der Anzahl der Elemente, es zu speichern, die zur Analysezeit bekannt ist.

Im Grunde {} ist Syntax und basiert auf einer Sprache und Bytecode-Ebene behandelt. dict () ist nur ein weiterer builtin mit einer flexibleren Initialisierungs-Syntax. Beachten Sie, dass dict () wurde nur in der Mitte der 2.x-Serie hinzugefügt.

Update : Danke für die Antworten. Entfernt Spekulationen über copy-on-write.

Ein weiterer Unterschied zwischen {} und dict ist, dass dict immer ein neues Wörterbuch ordnet (auch wenn der Inhalt statisch ist), während {} nicht immer hat so (siehe mgood's beantworten wann und warum):

def dict1():
    return {'a':'b'}

def dict2():
    return dict(a='b')

print id(dict1()), id(dict1())
print id(dict2()), id(dict2())

erzeugt:

$ ./mumble.py
11642752 11642752
11867168 11867456

Ich schlage nicht vor Sie versuchen, diesen Vorteil zu nehmen oder nicht, hängt es von der jeweiligen Situation, nur um es den Hinweis auf. (Es ist auch wahrscheinlich sich aus der Demontage , wenn Sie das verstehen OP-Codes).

dict () wird verwendet, wenn Sie ein Wörterbuch aus einem iterable erstellen möchten, wie:

dict( generator which yields (key,value) pairs )
dict( list of (key,value) pairs )

Funny Nutzung:

def func(**kwargs):
      for e in kwargs:
        print(e)
    a = 'I want to be printed'
    kwargs={a:True}
    func(**kwargs)
    a = 'I dont want to be printed'
    kwargs=dict(a=True)
    func(**kwargs)

Ausgabe:

I want to be printed
a

Um eine leere Menge erstellen wir das Schlüsselwort Set, bevor es verwendet werden soll d.h set() dies eine leere Menge erzeugt, wo, wie in dicts nur die Blumen Klammern eine leere dict erstellen

Fangen wir mit einem Beispiel gehen

print isinstance({},dict) 
True 
print isinstance({},set) 
False 
print isinstance(set(),set) 
True
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top