繁体   English   中英

从.NET循环调用Python太慢了

[英]Calling Python from .NET in a loop is just too slow

我们有很多需要从.NET的某些循环中调用的python库,它们太慢了。 我们使用的是Process.Start,每个调用大约花费1/3秒的时间,这意味着一些对话框需要30秒才能加载(在8核计算机上-我们的客户很可能会使用速度较慢的计算机)。

由于各种原因,我们不能使用IronPython(例如,某些使用IronPython已知问题的csv模块文件)。

我该怎么做才能加快速度? 即使我是python newb,但if elif else阻止,这些功能中的一些功能还是很简单的,并且一些性能分析显示,主要的“代价”是启动python.exe 是否有一些秘密选项可以启动单个python进程并将数据流进出?

一个类似的问题是这个。

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

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

args1
args2
\end

您可以通过这种方式节省启动时间,甚至可以在池中启用多处理(如果需要)。

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

您可以尝试使用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

不要在每个循环中都调用python函数。 如果您需要调用一个函数100次,则修改该函数以接受100个输入并返回100个输出。 在.NET中,构建我称之为批处理查询的内容 ,通过一个巨大的函数调用将其发送出去,然后继续进行其他需要完成的工作。

可能会叫我建议缓冲,尽管根据您的实际情况可能无法实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM