Эффективность в Python: a = массив [x] [y] против массива [x] [y]

Вы можете использовать оператор or для явного возврата None, если dict содержит пустой dict

results = x.get('field') or None

. Но имейте в виду, что вы получите None, для других типов значений весь статус bool false, например 0, '' и т. д.

0
задан sophros 18 January 2019 в 21:24
поделиться

2 ответа

Давайте выясним:

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

Итак, для относительно небольших массивов кажется, что разница составляет несколько микросекунд. Если вы пытаетесь сделать свой код более эффективным, это, вероятно, не является узким местом.

Если вы собираетесь повторно использовать значение, очевидно, сохраните его, чтобы вам не приходилось пересчитывать его.

0
ответ дан munk 18 January 2019 в 21:24
поделиться

Разница в производительности происходит от неявного использования оператора индексации и доступа к y -ому значению x -го «столбца» array. После назначения a (a = array[x][y]) нет необходимости выполнять эти операции для получения действительного значения в array[x][y] - оно легко доступно в a.

Точные различия в производительности зависят от реализации. В случае NumPy производительность array[x][y] была бы намного лучше, чем в случае списков собственных питонов, благодаря реализации, точно настроенной для массивов однородного типа и непрерывного блока выделения памяти.

Я рекомендую вам рассчитать время фактического использования , чтобы увидеть влияние в вашем конкретном случае.

0
ответ дан sophros 18 January 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: