Почему чтение в массиве numpy будет медленнее, чем в dict? - PullRequest
1 голос
/ 18 июня 2020

Я попытался провести сравнение чтения в словаре и в массиве numpy.

Я был уверен, что массив numpy будет быстрее, так как, когда я делаю numpy_array[i], ему просто нужно проверить i-е слово после начала массива, но при выполнении dictionary[i] будет использоваться ha sh вычисление и использование более сложной структуры данных.

Однако я пробовал это с% timeit в i python, со словарем и массивом, одинаковыми, и это мои результаты:

In [161]: def getter(obj, n): return obj[n]

In [162]: %timeit getter(dictionary, 6)
The slowest run took 10.84 times longer than the fastest. This could mean that an intermediate result is being cached.
10000000 loops, best of 3: 110 ns per loop

In [163]: %timeit getter(numpyarray, 6)
The slowest run took 27.87 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 180 ns per loop

Как вы можете это объяснить?

1 Ответ

0 голосов
/ 19 июня 2020

Следует отметить, что массив numpy требует значительного объема бухгалтерии, см. атрибуты ndarray . Вы можете повредить массив просто для удовольствия, изменив значение атрибута strides.

Кроме того, если вы извлечете элемент из массива с плавающей запятой, вы не получите собственный Python float , а скорее объект np.float64.

>>> type(np.linspace(0, 1)[0])
numpy.float64

Я подозреваю, что создание объекта np.float64 имеет больше накладных расходов, чем собственный Python float; по крайней мере, у него гораздо больше атрибутов и методов. Хотя не уверен; это не обычный объект, к которому вы можете добавлять атрибуты.

Между прочим, доступ к элементу 6 списка происходит примерно так же быстро, как на dict.

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