gpt4 book ai didi

python - 加速 python -c 调用

转载 作者:太空宇宙 更新时间:2023-11-04 11:20:12 24 4
gpt4 key购买 nike

我正在从我的 PHP Web 应用程序发出 python 命令行调用以执行一些 sympy 分析(然后我解析回 sympy 输出)。

这些调用时间比较长,但我觉得更多的是python启动和代码解析/编译比较耗时,而不是不等式系统本身的解决。

问题是我的程序会随着每次调用而变化:我总是解决不同的不等式系统。没有静态结构,所以我只能导入例如LSE 的系数。这是一个大小和结构各不相同的系统。所以(我认为),我不能使用 pyc 文件。

这里有两个示例调用:

/usr/bin/python -c "from sympy import Intersection; from sympy import solveset; from sympy import S; from sympy.abc import x; from sympy.functions.elementary.miscellaneous import Min, Max; print Intersection(*[solveset(p, x, S.Reals) for p in [(x > 4.0000), (x < 6.0000)]])" 2>&1


/usr/bin/python -c "from sympy import Intersection; from sympy import solveset; from sympy import S; from sympy.abc import x; from sympy.functions.elementary.miscellaneous import Min, Max; print Intersection(*[solveset(p, x, S.Reals) for p in [(x > 4.0000), (x < 6.0000), (((x) * 4.0000 + 5.0000) > 5.0000)]])" 2>&1

不平等系统可能会变得很大,并且一直不同。这是一个非线性表达式:

/usr/bin/python -c "from sympy import Intersection; from sympy import solveset; from sympy import S; from sympy.abc import x; from sympy.functions.elementary.miscellaneous import Min, Max; print Intersection(*[solveset(p, x, S.Reals) for p in [(x > 4.0000), (x < 6.0000), ((x * (Min(Max(x, 4.0000), 5.0000))) > 7.0000), ((Min(Max(x, 4.0000), 5.0000)) > 5.0000)]])" 2>&1

是否有任何命令行选项或配置设置可以加快这些程序的速度?

也许我可以预编译 sympy 导入?

编辑: 是否有一种 python 模式可以守护 python,等待我使用导入的 sympy 库发出请求?然后我只向它“发送”print Intersection(...) 命令?

编辑 2:

多亏了一个答案,我尝试了 pypy 包。但不幸的是,我无法报告改进的运行时间。使用标准的 python 2.7 我得到:

# time /usr/bin/python -c "from sympy import Intersection; from sympy import solveset; from sympy import S; from sympy.abc import x; from sympy.functions.elementary.miscellaneous import Min, Max; print Intersection(*[solveset(p, x, S.Reals) for p in [(x > 4.0000), (x < 6.0000), ((x * (Min(Max(x, 4.0000), 5.0000))) > 7.0000), ((Min(Max(x, 4.0000), 5.0000)) > 5.0000)]])"
EmptySet()

real 0m3.080s
user 0m2.920s
sys 0m0.050s

使用 pypy 我有:

# time pypy -c "from sympy import Intersection; from sympy import solveset; from sympy import S; from sympy.abc import x; from sympy.functions.elementary.miscellaneous import Min, Max; print Intersection(*[solveset(p, x, S.Reals) for p in [(x > 4.0000), (x < 6.0000), ((x * (Min(Max(x, 4.0000), 5.0000))) > 7.0000), ((Min(Max(x, 4.0000), 5.0000)) > 5.0000)]])"
EmptySet()

real 0m6.816s
user 0m6.660s
sys 0m0.080s

最佳答案

SymPy 的启动速度很慢,但并没有那么慢。你看到的缓慢只是你的特定方法在 SymPy 下很慢。通过使用整数而不是 float ,您可以使您的示例更快一些。

大部分时间花在 solveset 上,这对于您的许多简单关系来说似乎是不必要的。例如,用 x<4 调用 solveset 是没有意义的。什么时候可以使用 as_set

In [7]: (x<4).as_set()                                                                                                            
Out[7]: (-∞, 4)

您还可以将其他条件重写为更直接的形式,例如

In [11]: piecewise_fold(Min(Max(x, 4.0000), 5.0000).rewrite(Piecewise))                                                           
Out[11]:
⎧5.0 for x ≥ 5.0

⎨4.0 for x ≤ 4.0

⎩ x otherwise

我认为您可以组合一个比 solveset 更有效的求解器来处理这种情况。我建议制作一个比有效分派(dispatch)像 x<4 这样的简单案例更有效的函数。并且仅在更复杂的情况下调用 solveset。

关于python - 加速 python -c 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com