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 может значительно ускорить его, выполнив собственное прямое индексирование .