Python 2.7 积分使用替换的函数

Python 2.7 积分使用替换的函数,python-2.7,integration,substitution,Python 2.7,Integration,Substitution,你好,经验丰富的蟒蛇 我的问题涉及Python中的简单三重集成。要集成的功能的一个简单示例如下: -2*u - 5*v + 9*w + 15 这些函数是从输入文件读入的,但首先我想通过简单地将其作为函数来检查时间。此功能从0->1在u、v和w上集成。以下代码将集成此功能: from scipy.integrate import tplquad from time import time as epochTime def ppsi(u,v,w): F = -2*u - 5*v + 9*w

你好,经验丰富的蟒蛇

我的问题涉及Python中的简单三重集成。要集成的功能的一个简单示例如下:

-2*u - 5*v + 9*w + 15
这些函数是从输入文件读入的,但首先我想通过简单地将其作为函数来检查时间。此功能从0->1在u、v和w上集成。以下代码将集成此功能:

from scipy.integrate import tplquad
from time import time as epochTime

def ppsi(u,v,w):
   F = -2*u - 5*v + 9*w + 15
   return F
start = epochTime()
func = lambda u,v,w: ppsi(u,v,w)
u1,u2 = 0, 1
v1,v2 = lambda u: 0, lambda u: 1
w1,w2 = lambda u,v: 0, lambda u,v: 1
test = tplquad(ppsi, u1, u2, v1, v2, w1, w2)
print test
print ('Took:{:.3}s'.format(epochTime() - start))
正如人们所期望的那样(<0.01秒),这是非常迅速地计算出来的。由于这些函数实际上是从输入文件读入的,我首先用Python可以使用的可用格式替换字符串:

from scipy.integrate import tplquad
from time import time as epochTime

def ppsi(u,v,w):
    ## Psi is the function read in from the input file
    f = sympy.sympify(Psi)
    f = f.subs({"u": u})
    f = f.subs({"v": v})
    f = f.subs({"w": w})
    return f
start = epochTime()
func = lambda u,v,w: ppsi(u,v,w)
u1,u2 = 0, 1
v1,v2 = lambda u: 0, lambda u: 1
w1,w2 = lambda u,v: 0, lambda u,v: 1
test = tplquad(func, u1, u2, v1, v2, w1, w2)
print test
print ('Took:{:.3}s'.format(epochTime() - start))
replace命令允许Python像上面列出的那样处理函数,两段代码给出了相同的答案,但第二段代码的计算时间要长得多(>8s)

该时间增加是由于每次积分运行时应用替换的函数造成的吗?是否有一种简单的方法来补救这种情况,并在第二个实例中减少评估时间


提前感谢

使用wolfsgang提供的链接,我修改了代码,速度大幅提高:

start = epochTime()
f = lambdify([u,v,w], Psi, "numpy")
u1,u2 = 0, 1
v1,v2 = lambda u: 0, lambda u: 1
w1,w2 = lambda u,v: 0, lambda u,v: 1
F = tplquad(f, u1,u2,v1,v2,w1,w2)
print F
print ('Took:{:.3}s'.format(epochTime() - start))

这需要0.0095秒来评估,而最初需要8秒。因此,性能提高了三个数量级。Lambdify肯定是一条路要走

使用wolfsgang提供的链接,我修改了代码,速度大幅提高:

start = epochTime()
f = lambdify([u,v,w], Psi, "numpy")
u1,u2 = 0, 1
v1,v2 = lambda u: 0, lambda u: 1
w1,w2 = lambda u,v: 0, lambda u,v: 1
F = tplquad(f, u1,u2,v1,v2,w1,w2)
print F
print ('Took:{:.3}s'.format(epochTime() - start))

这需要0.0095秒来评估,而最初需要8秒。因此,性能提高了三个数量级。Lambdify肯定是一条路要走

检查Psi函数需要多长时间?输入文件大还是只有上面提到的单个函数?还有。SUB速度慢。检查一下这个。您可以看到各种表达式替换方法之间的比较。感谢您的回复。上面给出的示例是一个非常小的函数,但它们可以大得多。这个链接很有趣,我从来都不知道.subs有这样的性能问题。检查Psi函数需要多长时间呢?输入文件很大还是只有上面提到的单个函数?还有。subs很慢。看看这个。您可以看到各种表达式替换方法之间的比较。感谢您的回复。上面给出的示例是一个非常小的函数,但它们可以大得多。这个链接很有趣,我从来不知道.subs有这样的性能问题。