【发布时间】:2017-05-09 14:10:38
【问题描述】:
我正在尝试通过使用 subprocess Python 模块将一些重复计算外包给 C++ 程序来加速 Python 程序。
为了说明我的问题,我采用了一个简单的 C++ 代码,它返回输入的双精度值。一百万个整数需要 16 秒,看起来很慢。
这是 C++ 程序(double.exe):
#include <iostream>
using namespace std;
int main()
{
int a;
bool goon = true;
while (goon)
{
cin >> a;
cout << 2 * a << endl;
if (a == 0)
goon= false;
}
}
这里是 Python 3 代码:
from time import time
from subprocess import PIPE,Popen
cmd = ["double"]
process = Popen(cmd, stdin=PIPE,stdout=PIPE, bufsize=32,universal_newlines=True, shell=True)
t0 = time()
for i in range(1,int(1e6)):
print(i, file=process.stdin, flush=True)
output = int(process.stdout.readline())
dt = time() - t0
print("Time to communicate : %fs" % dt)
print(0,file=process.stdin,flush=True) # close 'double' program
沟通时间:16.029137s
对我而言,它之所以这么慢,只能是Python进程与C++程序之间通过管道进行通信,但我还没有找到如何加速它。使用子进程或其他库加速这种通信的任何解决方案?
我在 Windows 上使用 Python 3.5.2。
【问题讨论】:
-
为什么不直接将 C++ 代码作为一个像 boost::python 这样的模块公开给 Python?
-
a) 刚开始和关闭一个进程需要相当长的时间 b) 我不确定你的计算在 C++ 中是否实际上会更快。你有分析过吗?
-
除了模块方法之外,您还可以考虑使用 scipy.weave 或 cffi 之类的方法(可能适合您的用例,也可能不适合)。
-
我的经验也是 Windows 下的 stdin/stdout 通信非常慢。除了使用标准输入/标准输出之外的其他通信机制或在不同的操作系统下运行之外,我不确定可以做任何事情:(
-
@user45891 我还没有测试过,但据我所知,C/C++ 总是比 Python 快,尤其是对于简单的数字运算(我想在 C++ 上计算的任务就是这种情况) ),这就是为什么我想尝试一下,看看我能获得什么收益。
标签: python c++ subprocess pipe