numpy доступ к индексу по сравнению с производительностью numpy .array.item - PullRequest
0 голосов
/ 20 июня 2020

Я когда-то использовал numpy и использовался для доступа к массивам с помощью операции index, точно так же, как python списки, например:

img = np.zeros((640,480,3))
img[34, 19, 2]

Однако, читая одну книгу, я наткнулся на методы item и itemset . Согласно их документам, они обеспечивают повышение производительности. Однако, по крайней мере в документации, объясняется, почему это происходит. Кто-нибудь знает причину этого?

1 Ответ

1 голос
/ 21 июня 2020

TL; DR: Разница в скорости проистекает из различных типов , используемых item / itemset, и того факта, что оператор [] - более общие c. Действительно, оба используют встроенный тип float интерпретатора Python, а img[34, 19, 2] возвращает python объект np.float64. Более того, оператор [] поддерживает не только прямую индексацию, но также подвиды массивов и фильтрацию массивов, что не поддерживается item / itemset.

Чтобы полностью понять, почему существует разница в производительности, нужно смотреть в коде numpy. Методы item и itemset соответственно вызывают array_toscalar и array_setscalar . В качестве альтернативы, получение и установка непосредственно элемента массива соответственно вызывает array_subscript и array_assign_subscript .

Два последних метода немного дороже дорогих , потому что они generi c. Действительно, посмотрев разницу между array_toscalar и array_subscript, можно увидеть, что первый выполняет несколько вычислений и в основном вызывает PyArray_MultiIndexGetItem , который вызывает DOUBLE_getitem , а второй выполняет больше проверок. и распределения, и в основном вызывает PyArray_Scalar , который вызывает scalar_value , который сам выполняет косвенный переход, чтобы, наконец, создать объект np.float64.

Обратите внимание, что хотя item и itemset может быть быстрее, чем оператор [], numpy прямая индексация в CPython по-прежнему довольно медленная. Numba может значительно ускорить его, выполнив собственное прямое индексирование .

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