Python和C ++脚本交互

时间:2011-01-28 09:59:42

标签: c++ python optimization interaction

我正在尝试优化我拥有的两个脚本之间的交互。 我想到的两件事是c ++程序没有终止,除非你手动杀死它,或者在将它提供给c ++之前在python中生成所有信息。

问题解释:

脚本的作用: C ++程序(不是由我制作的,我不能很好地用c ++编程):取一个7数字数组并返回一个数字,简单。 Python脚本(我的,我可以在python位编程):那些产生7个阵列,将它们馈送到C ++程序,等待应答,并将其添加到列表中。然后它生成下一个数组。

从理论上讲,这是有效的。但是,就像现在一样,它会为每个调用打开和关闭c ++程序。对于一个没有问题的阵列,但我正在尝试升级到25k阵列,并且将来会扩展到600多万个阵列。显然,每次打开/关闭它都不再可行,特别是因为c ++程序首先必须加载一个130mb的VCD文件才能运行。

我自己想到的两个选项是首先在python中生成所有数组,然后将它们提供给c ++程序,然后分析所有结果。但是,我不知道如何使用6M阵列执行此操作。然而,重要的是我得到的结果与我输入的数组的顺序相同。

我想到的第二个选项是让c ++程序在每次调用后都不会退出。我不能程序C ++,虽然,所以我不知道这是可能的,保持“活着”这样你就可以只给数组到它在时间和得到答案。

(注:我不能在程序比任何其他蟒蛇,并希望在Python做这个项目的C ++程序不能转换到Python的速度的原因。)

提前致谢,Max。

5 个答案:

答案 0 :(得分:1)

首先,只是为了迂腐,正常使用中没有C ++脚本。 C ++最终编译为机器代码,C ++程序正确地称为一个“程序”而不是“脚本”。

但是要回答你的问题,你确实可以设置C ++程序留在内存中,它会监听连接并向Python脚本发送响应。你想学习Unix IPC,特别是套接字。

另一种方法是将C ++程序的功能合并到Python脚本中,完全忘记C ++。

答案 1 :(得分:1)

如果没有源代码或Python 脚本和C ++ 程序的确切规范,很难提供更多信息,但您可以重复修改C ++代码从标准输入读取数组,然后将结果写入标准输出。

然后你可以使用Python subprocess module从Python脚本启动C ++程序并与之通信。

请注意,简单地在C ++程序的main()函数周围包装一个循环将不会非常有用,因为显然主要问题是程序读取数据所需的时间(您提到的VCD) )。

循环需要严格围绕计算结果的代码 - 这意味着您可能必须以允许重复执行结果计算的方式将其他所有因素排除在外,而不会每次运行都会污染下一个。

答案 2 :(得分:1)

好的,你最好的做法可能是为Python编写一个C / C ++扩展,它能够调用C ++代码来完成你想要的计算。这不是非常困难,它只需要最少量的C / C ++编码就可以使它工作。扩展Python的一个很好的解释可以在http://docs.python.org/extending/extending.html

的Python页面上找到

您实际上做的是将C ++程序更改为Python进程可以链接并从Python脚本调用的动态库。

如果您需要一些帮助来实现它,我相信我们可以帮助您。

答案 3 :(得分:0)

我认为最好的方法是为python构建C ++扩展模块。
有很多方法可以做到这一点。
如果您有c ++源代码,可以尝试SWIG 之后你可以直接在python中使用c ++函数/对象 - 并通过python模块管理它们(这里处理)。这很简单。

答案 4 :(得分:0)

我认为你做错了

  

脚本的作用:C ++程序(不是由我制作的,我不能很好地用c ++编程):取一个7数字数组并返回一个简单的数字。 Python脚本(我的,我可以在python位编程):那些产生7个阵列,将它们馈送到C ++程序,等待应答,并将其添加到列表中。然后它会生成下一个数组。

你有这个吗?

python generate_arrays.py | someC++app | python gather_array.py

这允许您使用盒子上每个CPU的每个Core并行运行这三个部分。操作系统确保所有三个并发运行。

如果你仍然没有获得100%的CPU负载,你将不得不做这样的事情。

( python generate_arrays.py --even | someC++app >oneFile ) & ( python generate_arrays.py --odd | someC++app > anotherFile )
python gather_array.py oneFile anotherFile

这将运行python generate_arrays.py的两个副本和两个神奇的C ++程序副本。

您必须重写您的generate_arrays.py程序,以便它采用命令行选项。当选项为--even时,您将生成300万个数组。当选项为--odd时,您将生成其他300万个数组。

这(python | c ++)& (python | c ++)应该使用100%的cpu。