加快python -c调用

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我从我的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

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

也许我可以预先编译进口的症状?

编辑:是否有一个python模式可以守护python等待我的请求与导入的sympy libs?然后我只会“发送” 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下很慢。通过使用int而不是浮点数,您可以使示例更快一些。

大部分时间花在解决方案上,这对于你的许多简单关系来说似乎是不必要的。例如,x<4当你可以使用as_set时,没有必要调用solveset

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 

我认为你可以组合一个更有效的解决方案,处理该情况而不是解决方案。我建议创建一个比有效分派简单案例更有效的函数,x<4并且只在更复杂的情况下调用solveset。

用户回答回答于

有很多方法可以加速Python程序。推荐的方法是优化算法和代码(尝试python -m cProfile yourfile.py),最简单的方法是使用PyPy(JIT编译器用于长时间运行的代码)。其他选项包括Shed Skin(使用C ++的静态编译器),Numba(使用装饰器和LLVM的静态编译器),Cython(使用类型和C的静态编译器)和Nuitka

在您的情况下,至少将命令行代码放入.py文件并运行python -m compileall .以将其编译为.pyc字节码使得解析步骤更快,但是使用静态编译器完全跳过解释器可以忽略不计。

如果你正在制作REST API,那么根据这个基准测试Falcon框架是最快的Python FastCGI服务器之一; 这是一个小的SymPy REST API服务器演示项目

扫码关注云+社区

领取腾讯云代金券