использование словаря Python по умолчанию против .get () - PullRequest
0 голосов
/ 11 мая 2018

Я хочу словарь по умолчанию Нет.У меня есть два способа реализовать: 1) использовать collection.defaultdict и установить значение по умолчанию None.https://docs.python.org/2/library/collections.html

2) используйте обычный словарь, но используйте .get (), чтобы получить значение.Когда ключ не существует, по умолчанию он возвращает None.

Какой способ лучше?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

defaultdict будет использовать больше памяти, чем dict.get (), так как если ключ не найден, defaultdict установит значение по умолчанию в завернутом dict с ключом.

с другой стороны, dict.get () просто возвращает значение по умолчанию напрямую, если ключ не найден в dict. Не требуется дополнительного места.

Запуск 0,2 миллиарда с пустым dict с использованием python2,

200000000  199.584    0.000  283.804    0.000 default.py:11(get_default)
200000000  158.268    0.000  158.268    0.000 default.py:14(get_defaultdict)

Использование памяти при запуске 1 миллиона данных с пустым dict с использованием python2,

Line #    Mem usage    Increment   Line Contents
================================================
17   10.918 MiB   10.918 MiB   @profile
18                             def run_get_default():
19   10.918 MiB    0.000 MiB       h = {}
20   10.918 MiB    0.000 MiB       for i in xrange(0, COUNT):
21   10.918 MiB    0.000 MiB           get_default(h, i)
22   10.918 MiB    0.000 MiB           get_default(h, i)

Line #    Mem usage    Increment   Line Contents
================================================
24   10.918 MiB   10.918 MiB   @profile
25                             def run_get_defaultdict():
26   10.918 MiB    0.000 MiB       h = defaultdict(int)
27   83.496 MiB    7.273 MiB       for i in xrange(0, COUNT):
28   83.496 MiB   58.141 MiB           get_defaultdict(h, i)
29   83.496 MiB    7.164 MiB           get_defaultdict(h, i)

defaultdict нуждается в вызываемом значении в качестве значения по умолчанию для dict, вы также можете использовать функцию или лямбду, чтобы настроить собственное значение по умолчанию для каждого требования

dict.get ($ key, $ default) проще получить по умолчанию для каждой записи

Спасибо

0 голосов
/ 11 мая 2018

Если вы просто хотите, чтобы значением по умолчанию было None.Это не становится проще, чем просто использование метода .get ().

В качестве альтернативы, если вы хотите, чтобы значение впоследствии было установлено равным None после, вы можете использовать setdefault метод

a = {}
a[1] = "1"

print(a.get(1)) # prints 1
print(a.get(2)) # prints None
print(a.setdefault(2, None)) # prints None, and now a has an entry with key 2, and a value of None

Чтобы использовать defaultdict, вы должны написатьчто-то вроде этого

from collections import defaultdict
b = defaultdict(lambda: None) # this lambda returns the default value, 
# None in this case

b[1] = "1"
print(b[1]) # prints 1
print(b[2]) # prints None

Как указал qingdaojunzuo в своем ответе, .get () быстрее, чем использование словаря по умолчанию.Так что, вероятно, лучше придерживаться этого.Однако, если вам нужно вернуть что-то, отличное от None, defaultdict является ответом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...