1

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

问题说明:

脚本的作用: C++ 程序(不是我制作的,而且我不能很好地用 C++ 编程):采用 7 数字数组并返回一个数字,很简单。Python 脚本(我的,我可以在 python 中编写一点程序):生成这 7 个数字数组,将它们提供给 c++ 程序,等待答案并将其添加到列表中。然后它制作下一个数组。

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

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

我想到的第二个选择是让 c++ 程序在每次调用后都不会退出。我不能用 C++ 编程,所以我不知道这是否可能,保持它“活着”,这样你就可以有时将数组输入它并得到答案。

(注意:我不能用python以外的任何东西编程,我想用python做这个项目。由于速度原因,c++程序不能翻译成python。)

在此先感谢,马克斯。

4

5 回答 5

1

好的,您最好的做法可能是为 Python 编写一个 C/C++ 扩展,该扩展能够调用执行您想要的计算的 C++ 代码。这并不是很困难,它只需要最少量的 C/C++ 编码即可使其工作。可以在http://docs.python.org/extending/extending.html的 Python 页面上找到扩展 Python 的一个很好的解释

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

如果您需要一些帮助以使其正常工作,我相信我们可以为您提供帮助。

于 2011-01-28T11:04:48.680 回答
1

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

然后,您可以使用Python 子进程模块从您的 Python 脚本启动 C++ 程序并与之通信。

请注意,简单地围绕main()C++ 程序的函数进行循环不会很有帮助,因为显然主要问题是程序读取其数据所需的时间(您提到的 VCD)。

循环需要严格围绕计算结果的代码 - 这意味着您可能必须以一种允许重复完成结果计算而不会污染下一个运行的方式来考虑其他所有内容。

于 2011-01-28T10:31:29.490 回答
1

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

但是要回答您的问题,您确实可以将 C++ 程序设置为保留在内存中,它会在内存中侦听连接并向您的 Python 脚本发送响应。你会想研究 Unix IPC,尤其是套接字。

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

于 2011-01-28T10:18:20.067 回答
0

我认为你做错了

脚本的作用: C++ 程序(不是我制作的,而且我不能很好地用 C++ 编程):采用 7 数字数组并返回一个数字,很简单。Python 脚本(我的,我可以在 python 中编写一点程序):生成这 7 个数字数组,将它们提供给 c++ 程序,等待答案并将其添加到列表中。然后它制作下一个数组。

你有这个吗?

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

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

如果你仍然没有得到 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 程序,以便它采用命令行选项。When the option is --even, you generate 3 million arrays. When the options is --oddyou generate the other 3 million arrays.

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

于 2011-01-28T14:19:29.610 回答
0

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

于 2011-01-28T12:09:01.340 回答