在循环中从.NET调用Python太慢了

时间:2011-04-15 21:32:46

标签: .net python performance

我们有很多python库需要从.NET中的一些循环中调用,这些循环太慢了。我们正在使用Process.Start,每次调用大约需要1/3秒,这意味着一些对话需要30秒才能加载(在8核机器上 - 我们的客户很可能会有更慢的计算机)。

由于各种原因,我们无法使用IronPython(例如一些已知IronPython问题的文件using the csv module)。

我可以做些什么来加快速度?即使我是一个python newb,其中一些函数是简单的if elif else块,而一些分析显示主要的“成本”开始python.exe几十次。是否有一些秘密选项可以启动单个python进程并将内容流入和流出?

类似的问题是this one.

3 个答案:

答案 0 :(得分:2)

您可以重写脚本以接受来自标准输入的命令,而不是在完成后退出。

然后启动一个进程(或它们的池)并提供命令,而不是启动新进程。例如,不是创建新的some_script.py args1some_script.py args2,而是只生成some_script_wrapper.py并将其提供给它:

args1
args2
\end

您将以这种方式节省启动时间,甚至可以根据需要在池中启用多处理。

当然,您必须确保在数据部分之间完全处理输入/输出。为了使它更容易,你可以将你的参数/输出包装成一个已知的结构化格式(json?),确保你知道“消息大小”,或者甚至只是使用魔术标记找出你何时获得数据块的结尾

答案 1 :(得分:2)

您可以尝试使用pythonnet(http://pythonnet.sourceforge.net/readme.html#embedding)将python嵌入到.NET应用程序中,但不幸的是,几乎没有任何文档可以使用。

有些指针是http://mail.python.org/pipermail/pythondotnet/2007-June/000620.htmlhttp://mail.python.org/pipermail/pythondotnet/2010-August/000994.html

答案 2 :(得分:1)

不要在每个循环中调用python函数。如果需要调用100次函数,请修改所述函数以接受100个输入并返回100个输出。在.NET构建我称之为批处理查询的东西,在一个巨大的函数调用中发送它,然后继续进行其他任何需要完成的工作。

有人可以将我的建议称为缓冲,但可能无法取决于你实际做的事情。