gpt4 book ai didi

python - 为什么多次调用小数据时 numpy.linalg.norm 变慢?

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:01 29 4
gpt4 key购买 nike

import numpy as np
from datetime import datetime
import math

def norm(l):
s = 0
for i in l:
s += i**2
return math.sqrt(s)

def foo(a, b, f):
l = range(a)
s = datetime.now()
for i in range(b):
f(l)
e = datetime.now()
return e-s

foo(10**4, 10**5, norm)
foo(10**4, 10**5, np.linalg.norm)
foo(10**2, 10**7, norm)
foo(10**2, 10**7, np.linalg.norm)

我得到了以下输出:

0:00:43.156278
0:00:23.923239
0:00:44.184835
0:01:00.343875

似乎当 np.linalg.norm 被多次调用小数据时,它运行得比我的标准函数慢。

这是什么原因?

最佳答案

首先:datetime.now()不适合衡量性能,它包括挂钟时间,当高优先级进程运行或 Pythons GC 启动时,您可能只是选择了一个糟糕的时间(对于您的计算机),......

Python 中有专用的计时函数/模块:内置的 timeit 模块或 %timeit 在 IPython/Jupyter 和其他几个外部模块中(如 perf ,...)

让我们看看如果我对您的数据使用这些会发生什么:

import numpy as np
import math

def norm(l):
s = 0
for i in l:
s += i**2
return math.sqrt(s)

r1 = range(10**4)
r2 = range(10**2)

%timeit norm(r1)
3.34 ms ± 150 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.linalg.norm(r1)
1.05 ms ± 3.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit norm(r2)
30.8 µs ± 1.53 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.linalg.norm(r2)
14.2 µs ± 313 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

对于短的可迭代对象来说,它并不慢,它仍然更快。但是请注意,如果您已经拥有 NumPy 数组,NumPy 函数的真正优势就在于:

a1 = np.arange(10**4)
a2 = np.arange(10**2)

%timeit np.linalg.norm(a1)
18.7 µs ± 539 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.linalg.norm(a2)
4.03 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

是的,现在速度快多了。 18.7us vs. 1ms - 10000 个元素快了近 100 倍。这意味着 np.linalg.norm 的大部分时间在您的示例中,用于转换 rangenp.array .

关于python - 为什么多次调用小数据时 numpy.linalg.norm 变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866638/

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