Эффективность в Python: a = массив [x] [y] против массива [x] [y] - PullRequest
0 голосов
/ 19 января 2019

У меня есть несколько глупых вопросов об эффективности в Python:

  1. Будет ли эффективнее, если я назначу array[x][y] на a (например, a=array[x][y]), или лучше использовать array[x][y] напрямую?
  2. Для некоторых операций в Python было бы более эффективно, если бы я поместил их в одну функцию?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

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

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        

Таким образом, добавление присваивания добавляет две инструкции для байт-кода: 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 голосов
/ 19 января 2019

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

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

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

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