почему операции с dtype np.int64 намного медленнее по сравнению с аналогичными операциями с np.int16? - PullRequest
2 голосов
/ 09 июня 2019

Вот что я имею в виду - a - это вектор из 1.000.000 np.int64 элементов, b - это вектор из 1.000.000 np.int16 элементов:

In [19]: a = np.random.randint(100, size=(10**6), dtype="int64")

In [20]: b = np.random.randint(100, size=(10**6), dtype="int16")

время дляразличные операции:

In [23]: %timeit a + 1
4.48 ms ± 253 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [24]: %timeit b + 1
1.37 ms ± 14.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [25]: %timeit a / 10
5.77 ms ± 31.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [26]: %timeit b / 10
6.09 ms ± 70.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [27]: %timeit a * 10
4.52 ms ± 198 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [28]: %timeit b * 10
1.52 ms ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Я могу понять такую ​​разницу, когда Numpy придется создавать новый временный результат в памяти - основной код C должен будет копировать / заполнять гораздо больше данных в памяти.

Но я не могу понять такую ​​разницу для назначения значений, как показано ниже:

In [21]: %timeit a[::2] = 111
409 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [22]: %timeit b[::2] = 111
203 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

У вас есть идея, почему она медленнее даже для тех операций, где Numpy не нужносоздать копию / просмотреть?

1 Ответ

3 голосов
/ 09 июня 2019

Чтение из памяти чего-то стоит. Запись в память чего-то стоит. Вы читаете в четыре раза больше данных и записываете в четыре раза больше данных, и работа выполняется намного быстрее, чем чтение / запись в память, что фактически связано с вводом / выводом. Процессоры просто быстрее, чем память (и соотношение скоростей становится все более и более экстремальным с течением времени); если вы выполняете работу с большим объемом памяти, меньшие переменные будут работать быстрее.

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