gpt4 book ai didi

python - 在 Python 中向量化重复的数学函数

转载 作者:行者123 更新时间:2023-11-28 20:40:40 24 4
gpt4 key购买 nike

我有一个这种形式的数学函数 $f(x)=\sum_{j=0}^N x^j *\sin(j*x)$ 我想在 Python 中高效计算。 N 约为 100。这个函数 f 对一个巨大矩阵的所有条目 x 进行了数千次评估,因此我想提高性能(profiler 表明 f 的计算占用了大部分时间)。为了避免函数 f 定义中的循环,我这样写:

def f(x)
J=np.arange(0,N+1)
return sum(x**J*np.sin(j*x))

问题是,如果我想为矩阵的所有条目评估此函数,我需要先使用 numpy.vectorize,但据我所知,这不一定比循环。

有没有一种有效的方法来执行这种类型的计算?

最佳答案

欢迎来到 Sack Overflow! ^^

好吧,计算 something ** 100 是一件严肃的事情。但是请注意,当您声明数组 J 时,您是如何强制函数计算 x, x^2, x^3, x^4, ... (等等)独立。

让我们以这个函数(您正在使用的函数)为例:

def powervector(x, n):
return x ** np.arange(0, n)

现在这个甚至不使用 NumPy 的函数:

def power(x, n):
result = [1., x]
aux = x
for i in range(2, n):
aux *= x
result.append(aux)
return result

现在,让我们验证它们计算的是同一个东西:

In []: sum(powervector(1.1, 10))
Out[]: 15.937424601000005

In []: sum(power(1.1, 10))
Out[]: 15.937424601000009

很酷,现在让我们比较一下两者的性能(在 iPython 中):

In [36]: %timeit sum(powervector(1.1, 10))
The slowest run took 20.42 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 3.52 µs per loop

In [37]: %timeit sum(power(1.1, 10))
The slowest run took 5.28 times longer than the fastest. This could mean that an intermediate result is being cached
1000000 loops, best of 3: 1.13 µs per loop

速度更快,因为您不需要计算 x 的所有幂,因为您知道 x ^ N == (x ^ N - 1) * x并且您可以利用它。

您可以使用它来查看您的表现是否有所提高。当然,您可以更改 power() 以使用 NumPy 向量作为输出。你也可以看看Numba ,这很容易尝试,也可能会稍微提高性能。

如您所见,这只是关于如何改进问题的某些部分的提示。我敢打赌还有其他几种方法可以进一步改进您的代码! :-)

编辑

看起来 Numba 可能不是一个坏主意......只需添加 @numba.jit 装饰器:

@numba.jit
def powernumba(x, n):
result = [1., x]
aux = x
for i in range(2, n):
aux *= x
result.append(aux)
return result

然后:

In [52]: %timeit sum(power(1.1, 100))
100000 loops, best of 3: 7.67 µs per loop

In [51]: %timeit sum(powernumba(1.1, 100))
The slowest run took 5.64 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 2.64 µs per loop

Numba 似乎可以在那里施展魔法。 ;-)

关于python - 在 Python 中向量化重复的数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371499/

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