Numpy divide 和 Python divide 之间的区别?

Differences between Numpy divide and Python divide?

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

numpy.divide(x1, x2) ... Equivalent to x1 / x2 in terms of array-broadcasting. ...

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

非常感谢任何帮助!

此处似乎没有任何实际性能差异。

当我 运行 你的代码,并交换两个测试时,哪个先到先得快。

当我使用 timeit 进行适当的基准测试时,它们花费的时间大致相同(/ 为 540 毫秒,divide 为 539 毫秒)。

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


但让我们看看来源。 generate_umath.py creates the actual code, and it's assigning the same Ufunc (named numpy.core.umath.divide) to np.floor_divide and to the PyNumber_FloorDivide slot for np.ndarray. (If you're wondering why I looked up floor_divide when you're using divide and / instead of floor_divide and //, see the comment later where it deletes divide for Python 3 because it will be aliased it to true_divide.) IIRC, the actual code is a switch on types and sizes that ultimately ends up in one of the loop templates in loops.c.src.

中的代码

因此,除了显式 Ufunc 包装器代码与内置 method-wrapper 包装器代码的差异(这与任何非微型数组无关),它们最终都在同一个地方。