sympy 中的求解功能需要一些时间才能提出解决方案。是否可以通过降低所需的精度来加快速度(我真的不需要小数点后的 15 位数字!)?
问问题
1342 次
4 回答
1
请注意,打印 15 个小数并不意味着相对误差范围是 10^-15。
我鼓励在切换到单精度浮点数之前分析有效精度。
使用上面建议的任意精度包是检查结果如何更改的好方法:双位数并查看结果如何变化。还要检查输入的细微变化的影响。
于 2012-12-16T12:46:36.170 回答
0
使用 float 而不是 double 应该可以减少 1/2 的存储空间,并且可能会加速至少 2 倍——当你不做任何非线性或状态的事情时,从双精度到单精度会有好处。
其他并行化和算法优化技术也可能有所帮助,具体取决于您何时向我们展示代码。
于 2012-12-16T05:11:06.317 回答
0
注意:这个解决方案帮助我解决了这个问题。但是,我没有仔细研究过 sympy 的文档。所以使用这个基于经验的解决方案需要您自担风险,如果可能,请改进它。
假设我们有以下代码:
import sympy as sp
import time
P = sp.symbols('P')
equation = -sp.log(P/22064) - 10.494012
t0 = time.time()
ans = sp.solve(equation)
t1 = time.time()
calculation_time = t1 - t0
print('Time = %s sec' % calculation_time)
输出:
时间 = 1.6773369312286377 秒
现在这种缓慢的性能是由等式中的10.494012引起的。如果我将其更改为10.494,计算将在不到0.3秒内完成。显然,sympy 正在从我的输入中获取精度,并使用它来设置求解器的精度。无论如何,我不需要这样的洞察力。
所以解决方案是减少我的输入数字percisions;即用有限精度数字替换我的方程式中的所有数字。要自动执行此操作,我使用以下代码:
equation = equation.replace(
lambda expr: expr.func == sp.numbers.Float,
lambda x: round(x, 3))
(请注意,我已将 sympy 包含为 sp。)
于 2018-03-21T23:23:18.250 回答