gpt4 book ai didi

python - 针对函数中变量的固定值优化 Python 数学代码

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:28 25 4
gpt4 key购买 nike

我有一个很长的数学公式(只是为了让您了解上下文:它有 293095 个字符),实际上它是 python 函数的主体。这个函数有 15输入参数如下:

def math_func(t,X,P,n1,n2,R,r):
x,y,z = X
a,b,c = P
u1,v1,w1 = n1
u2,v2,w2 = n2
return <long math formula>

公式使用简单的数学运算+ - * ** /和一个函数调用 arctan .这是它的摘录:

r*((-16*(r**6*t*u1**6 - 6*r**6*u1**5*u2 - 15*r**6*t*u1**4*u2**2 +
20*r**6*u1**3*u2**3 + 15*r**6*t*u1**2*u2**4 - 6*r**6*u1*u2**5 -
r**6*t*u2**6 + 3*r**6*t*u1**4*v1**2 - 12*r**6*u1**3*u2*v1**2 -
18*r**6*t*u1**2*u2**2*v1**2 + 12*r**6*u1*u2**3*v1**2 +
3*r**6*t*u2**4*v1**2 + 3*r**6*t*u1**2*v1**4 - 6*r**6*u1*u2*v1**4 -
3*r**6*t*u2**2*v1**4 + r**6*t*v1**6 - 6*r**6*u1**4*v1*v2 -
24*r**6*t*u1**3*u2*v1*v2 + 36*r**6*u1**2*u2**2*v1*v2 +
24*r**6*t*u1*u2**3*v1*v2 - 6*r**6*u2**4*v1*v2 -
12*r**6*u1**2*v1**3*v2 - 24*r**6*t*u1*u2*v1**3*v2 +
12*r**6*u2**2*v1**3*v2 - 6*r**6*v1**5*v2 - 3*r**6*t*u1**4*v2**2 + ...

现在的重点是,在实践中,这个函数的批量计算将针对 P,n1,n2,R 的固定值进行。和 r它将自由变量集减少到只有四个,“理论上”参数较少的公式应该更快。

所以问题是:如何在 Python 中实现这种优化?

我知道我可以将所有内容都放在一个字符串中并执行某种 replace , compileeval喜欢在

formula = formula.replace('r','1').replace('R','2')....
code = compile(formula,'formula-name','eval')
math_func = lambda t,x,y,z: eval(code)

如果某些操作(如幂)可以用它们的值代替,例如 18*r**6*t*u1**2*u2**2*v1**2,那会很好应该变成 18*t对于 r=u1=u2=v1=1 .我想compile应该这样做,但无论如何我不确定。 是否compile实际执行此优化?

我的解决方案加快了计算速度,但如果我能压缩得更多,那就太棒了。注意:在标准 Python 中更可取(稍后我可以尝试使用 Cython)。

总的来说,我对 pythonic 的方式很感兴趣,也许可以使用一些额外的库来实现我的目标:什么是相当不错的方式?我的解决方案是好的方法吗?

编辑:(提供更多上下文)

巨大的表达式是对圆弧积分的符号线的输出。圆弧在空间中由半径给出 r ,两个正交法向量(如二维版本中的 x 和 y 轴)n1=(u1,v1,w1) , n2=(u2,v2,w2)和中心P=(a,b,c) .剩下的就是我正在执行集成的点 X=(x,y,z)和一个参数 R对于我正在集成的功能。

SympyMaple只需要很长时间来计算这个,实际输出来自 Mathematica .

如果你对这里的公式感到好奇它是(伪伪代码):

G(u) = P + r*(1-u**2)/(1+u**2)*n1 + r*2*u/(1+u**2)*n2
integral of (1-|X-G(t)|^2/R^2)^3 over t

最佳答案

你可以使用 Sympy:

>>> from sympy import symbols
>>> x,y,z,a,b,c,u1,v1,w1,u2,v2,w2,t,r = symbols("x,y,z,a,b,c,u1,v1,w1,u2,v2,w2,t,r")
>>> r=u1=u2=v1=1
>>> a = 18*r**6*t*u1**2*u2**2*v1**2
>>> a
18*t

然后你可以像这样创建一个 Python 函数:

>>> from sympy import lambdify
>>> f = lambdify(t, a)
>>> f(1)
18

f 函数确实很简单 18*t:

>>> import dis
>>> dis.dis(f)
1 0 LOAD_CONST 1 (18)
3 LOAD_FAST 0 (_Dummy_18)
6 BINARY_MULTIPLY
7 RETURN_VALUE

如果你想将生成的代码编译成机器码,你可以试试 JIT 编译器,比如 Numba , Theano , 或 Parakeet .

关于python - 针对函数中变量的固定值优化 Python 数学代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363573/

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