【问题标题】:Differences between Numpy divide and Python divide?Numpy 分界线和 Python 分界线的区别?
【发布时间】:2018-03-23 23:38:40
【问题描述】:

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

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

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

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,则a/b 为540ms,np.divide(a, b) 为539ms。如果我使用你幼稚的基准测试,无论我先做哪个都需要更长的时间。
  • 是的。显然,您的 CPU 缓存了其中一个结果。
  • 或者可能只是分配——第一个需要为数组分配空间;第二个重用刚刚释放的空间。但我会挖掘源代码以确保它们是相同的。

标签: python numpy division elementwise-operations


【解决方案1】:

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

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

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

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


但是让我们看看源头。 generate_umath.py 中的代码创建实际代码,并将相同的 Ufunc(命名为 numpy.core.umath.divide)分配给 np.floor_dividePyNumber_FloorDivide 插槽为 np.ndarray。 (如果您想知道为什么我在使用 divide/ 而不是 floor_divide// 时查找 floor_divide,请参阅后面的评论,其中删除了 Python 3 的 divide,因为它将其别名为true_divide。)IIRC,实际代码是类型和大小的开关,最终在loops.c.src中的一个循环模板中结束。

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

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 2021-03-27
    • 2014-04-02
    • 2016-10-07
    • 2021-09-05
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多