快速将图像从C进程传递到Python进程。
C进程是一个生成光栅图像的命令行工具。 Python进程是一个GUI应用程序,它要求C工具生成图像,然后显示这些图像。因此,用户(在他的行动之后)等待图像显示在GUI中。
目前使用的系统是通过C应用程序将文件写入磁盘,然后由Python应用程序读回。图像的大小可能会有所不同(但大约为1000x1000)。当前格式是未压缩的,但是使用压缩格式传输速度也很慢。
通常,需要创建和显示多个图像,因此也可以应用一些并行方法。但是,并行化(以及压缩)并没有使传输更快。
解决方案应该是跨平台的,尤其是GNU / Linux,MS Windows和Mac OS X.
该项目属于GNU GPL 2或更高版本,因此解决方案应兼容。
解决方案不应该带来新的大型依赖项,例如boost库。更小,系统或已经使用的库更受欢迎。
C应用程序正在使用cairo库。除非确实需要,否则最好不要添加新的依赖项。在极端情况下,可以使用ctypes将C代码包装到Python脚本中,但这不是首选。
Python应用程序使用wxPython,ctypes和PIL。可以添加新的依赖项,并且可以(甚至)包含新的库(但更少的依赖项更好)。
答案 0 :(得分:0)
鉴于......
C进程是一个命令行工具......
......你的选择非常有限。我最近回答了similar question,它使用了管道。
如果您可以使用守护程序进程替换命令行工具,则可以避免每次创建新进程的开销,并使用类似套接字的东西。
答案 1 :(得分:0)
这有多“慢”?如果你已经使用了库 - 比如PIL和cairo--它们确实有优化的代码来处理图像。 你的解决方案可以通过内存中的transfeirng fiels进行一些优化,而不是写入磁盘,然后重新读取它们 - 而且,通过不使用原始图像 - LZ样式压缩可以提高未压缩图像的速度 - 我想“ pcx“或”tiff“默认情况下可以使用此类压缩。 (另一方面,PNG压缩很慢)。
对于使用内存中传输而不是通过磁盘,我认为您可以使用以下方法: 创建一个二进制模块uising“cython”,将原始图像数据提供给PIL Image对象 - 并使用多处理调用cython0 - reated函数,可能使用concurrent.futures的backport
Cython是构建的必备条件,但不是运行此类模块的必备条件 - 我必须添加,因为依赖项是一个问题。
在任何情况下,我认为你应该在花费大量时间之前准确地描述你的系统 - 我认为你不能达到更好的速度(如果图像可能会增加200-300%)处理步骤很轻 - 但如果这会将你的时间从3秒减少到1你就不会那么好 - 从你的问题我推断你想要提升一个数量级)。如果你没有并行运行图像处理C程序,你当然应该为每个CPU核心至少产生一个这样的进程。