【问题标题】:How to efficiently pass images from C process to Python process?如何有效地将图像从 C 进程传递到 Python 进程?
【发布时间】:2013-04-17 09:38:00
【问题描述】:

目标

将图像从 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。可以添加新的依赖项,并且可以(甚至)包含新的库(但依赖项越少越好)。

【问题讨论】:

  • 您想要这个解决方案的价格是多少?我们可以分享报酬吗:D
  • 这不是问题,而是招聘信息。我有空...
  • 我是否应该补充一下我不要求提供完整源代码但要求可能(或最好)的方法?

标签: python c image wxpython ipc


【解决方案1】:

这有多“慢”?如果你已经在使用库——比如 PIL 和 cairo——他们确实有优化的代码来处理图像。 您的解决方案可以通过在内存中传输字段来优化,而不是先写入磁盘,然后重新读取它们 - 而且,通过不使用原始图像 - LZ 风格的压缩可以提高未压缩图像的速度 - 我认为“默认情况下,pcx" 或 "tiff" 可以使用此类压缩。 (另一方面,PNG 压缩很慢)。

对于使用内存传输而不是通过磁盘,我认为您可以使用以下方法: 创建一个使用“cython”的二进制模块,它将原始图像数据提供给 PIL Image 对象 - 并使用多处理调用 cython0--reated 函数,可能带有 concurrent.futures 的反向端口

Cython 是构建的必要条件,但不是运行此类模块的必要条件 - 我必须添加,因为依赖关系是一个问题。

无论如何,我认为您应该在花费大量时间之前准确地分析您的系统 - 我认为您无法获得更好的速度(如果图像可以提高 200-300%处理步骤很轻 - 但如果这会将你的时间从 3 秒减少到 1 秒,你就不会那么好 - 从你的问题我推断你想要一个数量级的提升)。如果您还没有并行运行图像处理 C 程序,那么您当然应该为每个 CPU 内核生成至少一个这样的进程。

【讨论】:

  • 虽然我仍然不确定该走哪条路,但您提供了很好的观点。例如,我可以确认使用未压缩格式而不是 PNG 会更好。
【解决方案2】:

鉴于...

C进程是命令行工具...

...您的选择非常有限。我最近回答了similar question,它使用了管道。

如果您可以将命令行工具替换为守护进程,则可以避免每次创建新进程的开销,而改用套接字之类的东西。

【讨论】:

猜你喜欢
  • 2018-06-15
  • 2012-03-24
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多