[英]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 args1
, some_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.html和http://mail.python.org/pipermail/pythondotnet/2010-August/000994.html 。
不要在每个循环中都调用python函数。 如果您需要调用一个函数100次,则修改该函数以接受100个输入并返回100个输出。 在.NET中,构建我称之为批处理查询的内容 ,通过一个巨大的函数调用将其发送出去,然后继续进行其他需要完成的工作。
可能会叫我建议缓冲,尽管根据您的实际情况可能无法实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.