Python与C++脚本交互
我正在尝试优化我手头两个脚本之间的互动。
我想到的两个方案是:一个是让C++程序在运行时不自动结束,另一个是先在Python中生成所有信息,然后再传给C++。
问题的解释:
这两个脚本的功能是:
C++程序(不是我写的,我的C++水平不太好):它接收一个包含7个数字的数组,然后返回一个单一的数字,操作很简单。
Python脚本(是我写的,我会一点Python):它生成这些7个数字的数组,把它们传给C++程序,等待结果,然后把结果加到一个列表里。接着,它会生成下一个数组。
理论上,这个流程是可行的。然而,现在的情况是,每次调用时都要打开和关闭C++程序。对于一个数组来说,这没问题,但我想处理25000个数组,未来可能会达到600万个数组。显然,每次都开关程序是不现实的,特别是因为C++程序在运行前需要加载一个130MB的VCD文件。
我想到的两个方案是:首先在Python中生成所有数组,然后再把它们传给C++程序,最后分析所有结果。不过,我不知道如何处理600万个数组。其实,结果的顺序和输入的数组顺序不需要一致。
我想到的第二个方案是让C++程序在每次调用后不退出。但我不会C++编程,所以不确定这样做是否可行,能否让它保持“活着”,这样我就可以随时传入数组并得到答案。
(注意:我只会Python,不想用其他语言来做这个项目。C++程序因为速度原因不能转换成Python。)
谢谢,Max。
5 个回答
没有Python脚本和C++程序的源代码或具体说明,想要提供更多信息就比较困难。不过,你可以修改C++代码,让它不断地从标准输入读取数组,然后把结果写到标准输出。
接着,你可以使用Python的子进程模块来从你的Python脚本启动C++程序,并和它进行沟通。
需要注意的是,单纯在C++程序的main()
函数外面加个循环并没有太大帮助,因为主要问题在于程序读取数据(你提到的VCD)所需的时间。
这个循环需要严格围绕计算结果的代码,也就是说,你可能需要把其他部分分开处理,以便结果计算可以重复进行,而不会让每次运行互相影响。
首先,得说清楚,正常情况下没有所谓的C++脚本。C++会被编译成机器代码,所以C++程序应该被称为“程序”,而不是“脚本”。
不过,回到你的问题,你确实可以让C++程序一直在内存中运行,这样它就可以监听连接,并向你的Python脚本发送响应。你可以研究一下Unix的进程间通信,特别是套接字(sockets)。
另外一种方法是把C++程序的功能直接整合到你的Python脚本里,这样就完全不需要C++了。
好的,你最好的做法可能是为Python写一个C/C++扩展,这样就能调用你想要的计算的C++代码了。这并不是特别难,只需要写一点点C/C++代码就能让它工作。关于如何扩展Python,有个很好的解释可以在Python的官网找到,链接是http://docs.python.org/extending/extending.html
简单来说,你需要把你的C++程序改成一个动态库,这样Python程序就可以链接并从Python脚本中调用它。
如果你在实现过程中需要一点帮助,我相信我们可以帮到你。