Вы можете использовать оператор or
для явного возврата None
, если dict содержит пустой dict
results = x.get('field') or None
. Но имейте в виду, что вы получите None, для других типов значений весь статус bool false, например 0
, ''
и т. д.
Давайте выясним:
In [8]: def with_assignment(arr, x, y):
...: a = arr[x][y]
...: return a
...:
In [9]: dis.dis(with_assignment)
2 0 LOAD_FAST 0 (arr)
3 LOAD_FAST 1 (x)
6 BINARY_SUBSCR
7 LOAD_FAST 2 (y)
10 BINARY_SUBSCR
11 STORE_FAST 3 (a)
3 14 LOAD_FAST 3 (a)
17 RETURN_VALUE
In [10]: def without_assignment(arr, x, y):
....: return arr[x][y]
....:
In [11]: dis.dis(without_assignment)
2 0 LOAD_FAST 0 (arr)
3 LOAD_FAST 1 (x)
6 BINARY_SUBSCR
7 LOAD_FAST 2 (y)
10 BINARY_SUBSCR
11 RETURN_VALUE
Итак, добавление присваивания добавляет две инструкции байт-кода, a STORE_FAST
и LOAD_FAST
. Таким образом, строго говоря, использование значения напрямую быстрее. Но на сколько?
In [34]: arr = [range(100) for _ in xrange(1000)]
In [35]: %timeit without_assignment(arr, random.randint(0,999), random.randint(0,99))
The slowest run took 9.75 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.83 µs per loop
In [36]: %timeit with_assignment(arr, random.randint(0,999), random.randint(0,99))
The slowest run took 10.57 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.8 µs per loop
Итак, для относительно небольших массивов кажется, что разница составляет несколько микросекунд. Если вы пытаетесь сделать свой код более эффективным, это, вероятно, не является узким местом.
Если вы собираетесь повторно использовать значение, очевидно, сохраните его, чтобы вам не приходилось пересчитывать его.
Разница в производительности происходит от неявного использования оператора индексации и доступа к y
-ому значению x
-го «столбца» array
. После назначения a
(a = array[x][y]
) нет необходимости выполнять эти операции для получения действительного значения в array[x][y]
- оно легко доступно в a
.
Точные различия в производительности зависят от реализации. В случае NumPy
производительность array[x][y]
была бы намного лучше, чем в случае списков собственных питонов, благодаря реализации, точно настроенной для массивов однородного типа и непрерывного блока выделения памяти.
Я рекомендую вам рассчитать время фактического использования , чтобы увидеть влияние в вашем конкретном случае.