如何加快python中的集成程序的速度?

时间:2018-10-03 21:29:26

标签: python-3.x computer-science integral

我制作了一个简单的GUI来解决用户输入的积分,我想知道是否有任何方法可以在不牺牲精度的情况下加快代码中积分的获取?对于小范围来说,这是非常快的,但是当上下限变大时,它的效率将非常低。

from tkinter import *
import parser
from math import *

def Integrate(eq, a, b):
    code = parser.expr(eq).compile() #parses user string into equation
    dx = 0.0000001
    area = 0.0
    x = a
    x_f = b
    while x <= x_f:
        x += dx
        area += (dx*eval(code))
    answer = float("{0:.5f}".format(area))
    print(answer)

master = Tk()
master.title("Integration Program")

instruction = Label(master, text="Enter f(x): ")
instruction.grid(row=0, column=0)

lower_label = Label(master, text="Lower Bound: ")
lower_label.grid(row=0, column=1)

upper_label = Label(master, text="Upper Bound: ")
upper_label.grid(row=0, column=2)

f_of_x = StringVar()
lwr = StringVar()
upr = StringVar()

entry_f = Entry(master, textvariable=f_of_x, width=20)
entry_f.grid(row=1, column=0)

entry_l = Entry(master, textvariable=lwr, width=5)
entry_l.grid(row=1, column=1)

entry_u = Entry(master, textvariable=upr, width=5)
entry_u.grid(row=1, column=2)

go = Button (master, text = "Integrate",
             command= lambda: Integrate(f_of_x.get(),
                                    float(lwr.get()), 
float(upr.get())))
go.grid(row=2, column=1)
mainloop()

1 个答案:

答案 0 :(得分:1)

正如c2huc2hu在评论中指出的,您可以使用其他数值积分方法。整本关于数值分析的书都描述了不同的选择,并且在任何给定情况下最合适。

并行化是值得考虑的另一种选择,当研究人员真正想解决大型计算问题时经常考虑使用这种选择。看来本质上是您正在做的欧拉方法(基本上使用有限的黎曼总和来逼近定积分)非常荒谬地平行:您可以根据需要将范围[a,b]分解为任意多个子范围,并有一个单独的子范围处理器解决每个问题。现在,如果您在单个CPU内核上运行,这将为您带来任何好处并增加开销。但是,如果您有一个多核CPU(我想现在所有的CPU都有多个核),则可以通过使用所有可用的并行管道来实现这种计算的直接成比例的加速。

现在考虑拥有类似GPU之类的东西,您可以在其中使用数百个内核。您可以在CUDA中编写上述集成,并且带有运行中的NVIDIA显卡的PC可以比单线程CPU应用程序快数百倍地解决问题。所有这些都没有-或者,如果您在GPU上使用单点,可能仍然可以忍受-准确性损失。对此的并行代码是什么样的?

dx = <const>
xi = <const>
xf = <const>

pt = floor((xf - xi) / dx)

tc = <const>
tl = ()

for n = 1 to tc do
    pt_start = floor(pt / tc) * (n - 1) + 1
    pt_stop = floor(pt / tc) * n
    x_start = xi + (pt_start - 1) * dx
    x_stop = xi + (pt_stop - 1) * dx
    if n = tc then x_stop = xf
    tl.add(new job(x_start, x_stop))

for n = 1 to tc do
    tl(n).start()

for n = 1 to tc do
    tl(n).join()

sum = 0
for n = 1 to tc do
    sum = sum + tl(n).result

return result

请注意,在后台并行运行的job函数只需使用您编写的方法将x_startx_stop的函数集成在一起即可。