小编典典

Numpy除法和Python除法之间的区别?

python

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分隔实现了一些额外的功能。

任何帮助深表感谢!


阅读 210

收藏
2020-12-20

共1个答案

小编典典

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

当我运行您的代码并交换两个测试时,以第二个为准。

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

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


但是,让我们看一下源代码。中的代码generate_umath.py创建实际的代码,并为的插槽分配相同的代码Ufunc(名为numpy.core.umath.divide)。(如果你想知道为什么我抬起头,当你使用和替代和,看到评论后它删除了Python
3中,因为它会被它别名。)IIRC,实际的代码是类型开关和大小最终会出现在中的一个循环模板中。np.floor_divide``PyNumber_FloorDivide``np.ndarray``floor_divide``divide``/``floor_divide``//``divide``true_divideloops.c.src

因此,除了显式的Ufunc包装器代码与内置method- wrapper包装器代码(对于任何不是很小的数组都无关紧要)之间的差异之外,它们最终都位于同一位置。

2020-12-20