Jaký je rozdíl mezi dict () a {}?

hlasů
51

Takže řekněme, že chci, aby slovník. Budeme ji nazývat d. Ale existuje několik způsobů, jak inicializovat slovník v Pythonu! Například, mohl bych to následujícím způsobem:

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

Nebo můžu to následujícím způsobem:

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

Nebo to, zvědavě:

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

Nebo toto:

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

A úplně jiná množství způsobů, jak s dict()funkcí. Je tedy jasné, jedna z věcí, dict()poskytuje je flexibilita v syntaxi a inicializaci. Ale to není to, co jsem ptal.

Řekněme, že se mi dělat djen prázdný slovník. Co se děje v zákulisí Python interpret, když jsem dělat d = {}proti d = dict()? Je to prostě dva způsoby, jak dělat totéž? Má za použití {}mají další výzvu dict()? Má někdo mít (i zanedbatelnou) větší režii než jiný? Zatímco otázka je opravdu zcela bezvýznamné, je to zvědavost, rád bych odpověděl.

Položena 19/03/2009 v 22:19
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
61

>>> 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 () je zřejmě nějaký C vestavěné. Opravdu chytrý nebo vyhrazený osoba (já ne) mohli podívat na zdroje tlumočníka a říct víc. Jen jsem chtěl předvést dis.dis. :)

Odpovězeno 19/03/2009 v 22:25
zdroj uživatelem

hlasů
31

Co se týče výkonu pokračuje:

>>> from timeit import timeit
>>> timeit("a = {'a': 1, 'b': 2}")
0.424...
>>> timeit("a = dict(a = 1, b = 2)")
0.889...
Odpovězeno 19/03/2009 v 22:41
zdroj uživatelem

hlasů
25

@Jacob: Je rozdíl v tom, jak jsou objekty přiděleny, ale nejsou copy-on-write. Python přiděluje pevné velikosti „free seznamu“, kde je možné rychle alokovat slovníku objektů (tak, aby vyplňoval). Slovníky přidělené prostřednictvím {}syntaxe (nebo C volání PyDict_New) mohou pocházet z tohoto volného seznamu. Je-li slovník již není odkazováno dostane se vrátil do volného seznamu a že blok paměti mohou být znovu použity (když pole se vrátí jako první).

Tato první slovník dostane okamžitě vráceny zpět do volného seznamu a příští bude znovu použít své paměti:

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

Pokud budete mít odkaz, příští slovníku pocházejí z dalšího volného slotu:

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

Ale můžeme odstranit odkaz na tento slovník a opět volný slotu:

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

Vzhledem k tomu, {}syntax je nakládáno v byte-kódu je možné použít tuto optimalizaci výše uvedené. Na druhé straně dict()je zpracován jako běžný konstruktoru třídy a Python používá generický paměťový alokátor, který nedodržuje snadno předvídatelné jako volný výše uvedeném seznamu.

Také při pohledu na compile.c Python 2.6, s {}syntaxe se zdá, že pre-size HashTable na základě počtu kusů je to ukládání, která je známá době analýze.

Odpovězeno 25/03/2009 v 13:28
zdroj uživatelem

hlasů
8

V podstatě {} je syntaxe a je zpracována na jazyk a bytecode úrovni. dict () je jen další zabudovaná s pružnějším syntaxe inicializace. Všimněte si, že dict () byla přidána až v polovině 2.x série.

Odpovězeno 20/03/2009 v 00:15
zdroj uživatelem

hlasů
5

Aktualizace : díky za odpovědi. Odstraněna spekulace o tom, copy-on-write.

Jedním z dalších rozdíl {}a dictje to dictvždy alokuje nový slovník (a to i v případě, že obsah je statický), přičemž {}ne vždy to tak (viz odpověď mgood je pro kdy a proč):

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

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

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

vyrábí:

$ ./mumble.py
11642752 11642752
11867168 11867456

Netvrdím, zkuste využít, nebo ne, záleží na konkrétní situaci, jen ukázal to. (Je to také pravděpodobně zřejmé z demontáže , pokud jste pochopili opcodes).

Odpovězeno 20/03/2009 v 19:44
zdroj uživatelem

hlasů
3

dict () se používá, když chcete vytvořit slovník z iterable, jako jsou:

dict( generator which yields (key,value) pairs )
dict( list of (key,value) pairs )
Odpovězeno 29/04/2011 v 22:50
zdroj uživatelem

hlasů
1

Funny Využití:

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)

výstup:

I want to be printed
a
Odpovězeno 06/02/2018 v 14:32
zdroj uživatelem

hlasů
-1

Za účelem vytvoření prázdná množina bychom měli používat klíčové slovo nastavit před ním tedy set()vytváří prázdná množina kde stejně jako v dicts jen květina konzoly může vytvořit prázdnou dict

Pojďme s příkladem

print isinstance({},dict) 
True 
print isinstance({},set) 
False 
print isinstance(set(),set) 
True
Odpovězeno 31/05/2016 v 14:30
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more