Время практически одинаковое. Как отмечают другие, здесь нет какого-либо аппаратного обеспечения или многоядерного распараллеливания, а просто смесь интерпретируемых функций Python и numpy
.
In [289]: x = np.ones((1000,1000))
In [290]: timeit 1-np.log(x)
15 ms ± 1.94 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [291]: timeit np.subtract(np.ones_like(x), np.log(x))
18.6 ms ± 1.89 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Извлеките np.ones_like
из цикла синхронизации:
In [292]: %%timeit y = np.ones_like(x)
...: np.subtract(y,np.log(x))
...:
...:
15.7 ms ± 441 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2/3 времени тратится в функции log
:
In [303]: timeit np.log(x)
10.7 ms ± 211 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [306]: %%timeit y=np.log(x)
...: np.subtract(1, y)
3.77 ms ± 5.16 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Изменения в том, как генерируется 1
, составляют незначительную часть времени.
С помощью «широковещания» математику с помощью скаляра и массива или массива и массива можно легко выполнить.
1
, скалярное (фактически массив с формой ()
), транслируется на (1,1), а затем на (1000,1000), все это без копирования.