poo*_*a13 5 python numpy division elementwise-operations
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)
Run Code Online (Sandbox Code Playgroud)
似乎Python鸿沟通常运行得更快,这使我相信Numpy鸿沟实现了一些额外的花里胡哨.
任何帮助深表感谢!
这里似乎没有任何实际的性能差异.
当我运行你的代码并交换两个测试时,无论哪一个更快.
当我timeit用于正确的基准测试时,它们需要大约相同的时间(540毫秒,/而539毫秒divide).
我的猜测是你测量的差异是malloc数组的时间 - 第一个需要这样做,第二个可以重用刚刚释放的内存.
但是让我们来看看来源.代码generate_umath.py创建实际代码,并为插槽分配相同Ufunc(命名numpy.core.umath.divide).(如果你想知道为什么我在你使用的时候会查找而不是和,请稍后查看它为Python 3 删除的注释,因为它会将其别名化.)IIRC,实际的代码是类型和最终在其中一个循环模板中结束的大小.np.floor_dividePyNumber_FloorDividenp.ndarrayfloor_dividedivide/floor_divide//dividetrue_divideloops.c.src
因此,除了显式Ufunc包装器代码与内置method-wrapper包装器代码(它与任何不小的数组无关)之间的差异之外,它们最终会出现在同一个地方.