【发布时间】:2021-04-13 19:17:45
【问题描述】:
我刚刚翻译了一组涉及矩阵的科学计算,其中元素是符号表达式,它们被微分并与各种其他数学表达式组合,然后进行数值积分。为了重现我遇到的性能差距,下面的代码片段构成了一个最小的示例。我知道符号区分然后数字积分没有意义,但同样,关键在于性能差距。需要注意的是,导入库并不需要太多时间,也不能解释性能差距。
朱莉娅代码:
using Symbolics, QuadGK
@variables x
m = [i * 10*x^3 + 1/i * sin(x) + 5*i*x^3 * cos(x) - 8i*x^2 + 2/sin(i*3.0)*x + exp(1/(x+10)) for i in 1:500]
m_d = expand_derivatives.(Differential(x).(m))
m_d_expr = build_function(m, x)
m_d_f = eval(m_d_expr[1])
v = quadgk(m_d_f, 0, 1)
print(v[1])
Python 代码:
import pandas as pd
import numpy as np
from sympy import sin, diff, pi, lambdify, integrate, cos, exp
from sympy.abc import x
from sympy.matrices import Matrix
from scipy.integrate import quad
def integrate_matrix(m, v, a, b):
mi = np.zeros((m.rows, m.cols))
for i in range(m.rows):
for j in range(m.cols):
f = lambdify(v, m[i, j])
integral_value = quad(f, a, b)[0]
mi[i, j] = integral_value
return mi
m = Matrix([i * 10*x**3 + 1/i * sin(x) + 5*i*x**3 * cos(x) - 8*i*x**2 + 2/sin(i*3.0)*x + exp(1/(x+10)) for i in range(1, 501)])
v = integrate_matrix(m, x, 0, 1)
print(v)
我的问题:有没有办法改进 Julia 代码以匹配 Python 代码的性能。每次我试图在 Julia 的表现上给我的码头留下深刻印象时,我都会感到尴尬。我仍然是 Julia 菜鸟,但我真的不知道该怎么办。
大概时间: 蟒蛇:6秒 朱莉娅:30 多秒
Julia 版本 1.6 Python 3.7
注意:由于差距很大,我发布了这个。不,CAS 并没有解释这一切。此外,我们正在做一个符号差异而不是集成,更不用说 sympy 被称为慢。我可以将代码添加到精确的时间,然后呢?我遇到问题的原始科学代码是 6 秒 Python 和 75 秒 Julia。真可惜。
【问题讨论】:
-
因此,这可能归结为您正在使用的 CAS 库。我怀疑你在 Python 中实际所做的事情是否会产生巨大的影响
-
最好添加有关您使用的时间和其他性能指标的信息,以表明存在性能差距。以及有关您如何进行基准测试以及您使用的语言和软件包版本的信息。
-
你是如何测量时间的?我刚刚对
quadgk(m_d_f, 0, 1)进行了基准测试,这需要 264 毫秒(在我的计算机中使用@benchmark),而integrate_matrix(m, x, 0, 1)1.36 s ± 15.6 毫秒(在 iPython 中使用%timeit)。看来您观察的时间考虑了编译时间. -
我不确定我是否理解您的评论。我看到 Julia 代码在忽略编译时间后运行更快(因此,您先付钱但获得运行速度更快的代码)。
-
这不是挑剔,更多的是关于你的用例和理解观察到的差异。我也不在辩护,这完全取决于您的用例:如果您需要编译一次并运行多次,那么 Julia 最终会更快。如果您需要运行一次,那么 Python 可能是更好的选择。话虽如此,您可能想探索PackageCompiler.jl 或在 Julia 的演讲中询问您是否仍然不满意。
标签: python performance julia