12

numpy.divide和 Python 斜杠/运算符有什么异同?据我所知,它们的行为相同,都实现了元素划分。Numpy 文档提到:

numpy.divide(x1, x2) ... 在数组广播方面相当于 x1 / x2。...

暗示 np.divide(x1, x2) 不完全等同于 x1 / x2。我运行了以下代码段来比较它们的速度:

import numpy as np
import time

a = np.random.rand(10000, 10000)
b = np.random.rand(10000, 10000)

tic = time.time()
c = a / b
toc = time.time()
print("Python divide took: ", toc - tic)

tic = time.time()
c = np.divide(a, b)
toc = time.time()
print("Numpy divide took: ", toc - tic)

看起来 Python 分界线通常运行得更快,这让我相信 Numpy 分界线实现了一些额外的花里胡哨。

任何帮助深表感谢!

4

1 回答 1

18

这里似乎没有任何实际的性能差异。

当我运行您的代码并交换两个测试时,无论哪个第二个都会更快。

当我timeit用于正确的基准测试时,它们大约需要相同的时间(540ms/与 539ms divide)。

我的猜测是,您测量的差异是 malloc 数组的时间——第一个需要这样做,第二个可以重用刚刚释放的内存。


但是让我们看看源头。中的代码generate_umath.py创建实际代码,并将相同的Ufunc(命名为numpy.core.umath.divide)分配np.floor_divide给. (如果您想知道为什么我在使用and而不是and时查找,请参阅稍后为 Python 3 删除的注释,因为它将别名为。) IIRC,实际代码是类型和最终出现在.PyNumber_FloorDividenp.ndarrayfloor_dividedivide/floor_divide//dividetrue_divideloops.c.src

因此,除了显式 Ufunc 包装器代码与内置method-wrapper包装器代码的差异(这对于任何不小的数组都无关紧要)之外,它们最终会出现在同一个地方。

于 2018-03-24T00:08:44.263 回答