加速python-c调用

加速python-c调用,python,sympy,Python,Sympy,我从PHP web应用程序发出python命令行调用,以执行一些Symphy分析(然后解析Symphy输出) 这些调用需要很长时间,但我认为需要花费大量时间的更多是python启动和代码解析/编译,而不是不等式系统本身的解决方案 问题是我的程序随着每次调用而改变:我总是解决不同的不等式系统。没有静态结构,因此我只能导入LSE的系数。这是一个大小和结构各异的系统。所以(我想),我不能使用pyc文件 以下是两个示例性呼叫: /usr/bin/python -c "from sympy import

我从PHP web应用程序发出python命令行调用,以执行一些Symphy分析(然后解析Symphy输出)

这些调用需要很长时间,但我认为需要花费大量时间的更多是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
对于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
#time pypy-c“来自Symphy导入交叉点;来自Symphy导入解算集;来自Symphy导入S;来自Symphy.abc导入x;来自Symphy.functions.elementary.miscellaneous导入最小值,最大值;打印交叉点(*[p,x,S.Reals)对于p in[(x>4.0000),(x<6.0000),((x*(最小值(最大值(x,4.0000))>7.0000),((最小值(最大值,4.0000), 5.0000)) > 5.0000)]])"
清空
实0m6.816s
用户0m6.660s
sys 0m0.080s

有很多方法可以加速Python程序。推荐的方法是优化算法和(尝试),最简单的方法是使用(JIT编译器用于长时间运行的代码)。包括(使用C++的静态编译器),(使用decorators和LLVM的静态编译器),(建议使用类型和C++的静态编译器),以及

在您的例子中,至少将命令行代码放入
.py
文件并运行
python-mcileall.
可以加快解析步骤,但是使用静态编译器完全跳过解释器是可以忽略的


如果您正在制作一个RESTAPI,那么它是最快的PythonFastCGI服务器之一;下面是一个例子。

SymPy启动速度很慢,但没有那么慢。你所看到的缓慢只是你的特殊方法在SymPy下是缓慢的。通过使用int而不是float,可以使示例的速度加快一点


大部分时间都花在solveset上,这对于许多简单关系来说似乎是不必要的。例如,用
xThanks调用solveset没有任何意义。为了得到非常有价值的答案,我对它进行了处理并编辑了我的问题…#编译成字节码对我来说是没有选择的,因为我一直在动态创建实际的代码。在PyPy中运行Falcon服务器最终应该会编译你的Symphy函数。尽管很不幸
# 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
# 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
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