Python: Какой вариант проверки наличия элемента в словаре и его использования лучше с точки зрения производительности?
Есть словарь с такой структурой:
data = {
'key': {
'subkey': 'value'
}
}
И необходимость получить значение вложенного словаря, при условии того, что наличие ключа 'key' в data неизвестно.
Это можно записать так:
value = None
if 'key' in data:
value = data['key']['subkey']
Либо же в одну строку. Я часто использую 2 способа.
Первый:
value = None if 'key' not in data else data['key']['subkey']
Второй:
value = None if not (subdict := data.get('key')) else subdict['subkey']
Вопрос заключается в том, есть ли разница какой из вариантов использовать в случаях, когда подобная проверка проводится многократно за небольшое время? Возможно есть какой-то еще более простой способ?
Ответы (2 шт):
Автор решения: Алексей Р
→ Ссылка
data = {
'key': {
'subkey': 'value'
}
}
print(data.get('key') and data['key']['subkey'])
Модификация варианта с in чуть быстрее, чем с get(), но при неудаче возвращает False, а не None:
'key' in d and d['key']['subkey']
Автор решения: Алексей Р
→ Ссылка
Сравнение предложенных на странице вариантов:
from time import time
data = [{
'key': {
'subkey': 'value'
}
}, {
'key1': {
'subkey': 'value'
}
}]
def f1(d):
value = None
if 'key' in d:
return d['key']['subkey']
def f2(d):
return None if 'key' not in d else d['key']['subkey']
def f3(d):
return None if not (subdict := d.get('key')) else subdict['subkey']
def f4(d):
return d.get('key', {'subkey': None})['subkey']
def f5(d):
return d.get('key') and d['key']['subkey']
n = 10**7
for i in f1, f2, f3, f4, f5:
t = time()
for j in range(n):
i(data[0])
i(data[1])
print(f'Время варианта {i.__name__} = {time() - t}')
Время варианта f1 = 2.34299898147583
Время варианта f2 = 2.1999993324279785
Время варианта f3 = 2.9900007247924805
Время варианта f4 = 3.6739983558654785
Время варианта f5 = 2.582000494003296