【问题标题】:Manipulating Polynomial Integrals Python操作多项式积分 Python
【发布时间】:2018-01-08 16:50:20
【问题描述】:

我正在尝试矢量化,这个等式使其更快(即不使用循环)这是 sslow 与 sfast 相对的想法。

mu2 = [1.0, 0.11264281499520618, 0.012799179048180226]
alpha = np.array([   52.64173932, -1016.96156872,  4514.08903276])
def sslow(alpha):
    t0 = time()
    u = lambda x: np.exp(-(1+np.poly1d(list(reversed(alpha)))(x)))
    k = sp.integrate.quad(lambda x: u(x), 1e-16, 1)[0]+np.dot(mu2,alpha),(time()-t0)
return k
def sfast(alpha):
    t0 = time()
    def int1(b):
        j = 1
        for q in range(0,len(alpha)):
            j = j + alpha[q]*(b**q)
        return np.exp(-j)
    ans, err = sp.integrate.quad(int1, 1e-16, 1)
    u = ans+np.dot(mu2,alpha);
    return u,(time()-t0)
t = []
r = int(1e3)
for d in range(0,r):
    t = (np.append(t,sslow(alpha)[1]))
print sum(t)/r
t = []
for d in range(0,r):
    t = (np.append(t,sfast(alpha)[1]))
print sum(t)/r

我完全错过了什么吗?有没有更好的方法来对向量和多项式基进行点积然后积分?

【问题讨论】:

  • 要真正获得有意义的速度测试,您不能只运行一次。尝试做 1000 次,然后除以时间。可能你看到的是调用 scipy 函数的开销,而且对于非常小的问题,你的循环函数确实更快。
  • @Joe 我已经完全做到了,并且 5 的因素仍然存在。
  • 您能否将您的代码编辑为最​​低限度的工作示例,例如添加您使用的变量mu2alpha 等并添加导入。您还可以添加时间,这样人们就可以轻松地复制粘贴并在他们的机器上运行它。
  • @Joe 完成。你能想出一个更好的方法来创建多项式和浮点数的点积然后积分吗?
  • 会看看。您的示例缺少导入。这个答案对你有帮助吗? stackoverflow.com/a/24066766/7919597

标签: python computer-science polynomials


【解决方案1】:

您的函数中的点积很好。如果mualpha2 只有三个条目,那么显式计算可能会更快,因为np.dot 有一点开销,例如使用np.sum(mu * alpha) 甚至alpha[0] * mu[0] + alpha[1] * mu[1] + alpha[2] * mu[2]。不漂亮,但我发现对于非常小的计算它的性能优于 numpy 函数。

我修改了你的sslow 函数,它比我机器上的sfast 快两倍。随意添加显式点积。

def sslow5(alpha):
    t0 = time.time()

    u = lambda x: np.exp(-(1 + (alpha[2]*x + alpha[1])*x + alpha[0]))

    k = quad(u, 1e-16, 1)[0] + np.dot(mu2, alpha),(time.time()-t0)
    return k

嗯,这仅适用于您可以明确说明方程式的非常低的度数(请参阅https://stackoverflow.com/a/24067326/7919597)。

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多