Вот что я имею в виду - 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 не нужносоздать копию / просмотреть?