时间基本上是相同的。正如其他人指出的那样,没有任何硬件或多核并行化,只有解释的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)
三分之二的时间都花在了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)
,而且这一切都不需要拷贝。