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
→ Ссылка