gpt4 book ai didi

numpy - 为什么 numpy.absolute() 这么慢?

转载 作者:行者123 更新时间:2023-12-03 15:48:16 26 4
gpt4 key购买 nike

我需要优化一个脚本,该脚本大量使用计算向量的 L1 范数。
正如我们所知,在这种情况下 L1 范数只是绝对值的总和。在计算 numpy 在这项任务中的速度时,我发现了一些奇怪的事情:添加所有向量元素比获取向量的每个元素的绝对值快大约 3 倍。这是一个令人惊讶的结果,因为与取绝对值相比,加法相当复杂,后者只需要对数据块的每 32 位进行清零(假设为 float32)。

为什么加法比简单的按位运算快 3 倍?

import numpy as np

a = np.random.rand(10000000)

%timeit np.sum(a)
13.9 ms ± 87.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit np.abs(a)
41.2 ms ± 92.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

最佳答案

这里有几件事情需要考虑。 sum返回标量 abs返回一个数组。所以即使两个数相加取绝对数也是一样的abs会更慢,因为它需要创建数组。它必须处理两倍的元素(从输入读取 + 写入到输出)。

所以你不能从这些时间推断出任何关于加法与按位运算的速度。

但是,您可以检查将某些内容添加到数组的每个值与取每个值的绝对值是否更快

%timeit a + 0.1
9 ms ± 155 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit abs(a)
9.98 ms ± 532 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

或者比较总和 + 内存分配与取绝对值
%timeit np.full_like(a, 1); np.sum(a)
13.4 ms ± 358 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit abs(a)
9.64 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

以防万一您想让计算规范更快,您可以尝试使用 numba(或 Cython,或自己编写 C 或 Fortran 例程),这样可以避免任何内存分配:
import numba as nb

@nb.njit
def sum_of_abs(arr):
sum_ = 0
for item in arr:
sum_ += abs(item)
return sum_

sum_of_abs(a) # one call for the jitter to kick in
%timeit sum_of_abs(a)
# 2.44 ms ± 315 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于numpy - 为什么 numpy.absolute() 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46512598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com