【问题标题】:PyQt4 with Cython = Bad Idea?PyQt4 与 Cython = 坏主意?
【发布时间】:2014-07-27 16:43:57
【问题描述】:

我工作中的某个人使用PyQt4 编写了一些python 模块。我写了一个Jython 应用程序,它应该允许Python 模块访问我们API 的Java 绑定,但我没有意识到Jython 不能使用ctypes,因此整个应用程序基本上没用。

我正在努力寻找一个解决方案,说明如何将我们的 API 暴露给他的 Python 模块。我们的 API 是 C 并且具有 C++ 绑定(以及 Java 和 Perl),所以我认为最好的解决方案是将其中一个 C/C++ API 暴露给他的 Python 模块。

而不是使用 ctypes、sig、swig 等为 Python 做一个 C/C++ 包装器(我预计会做很多工作)。我想也许我可以让他使用 Cython。根据我一直在阅读的内容,您无需做太多工作即可将您的 Python 代码转换为 Cython,因此我可以为他创建一些测试示例,演示如何将他的 Python 模块转换为 Cython,并向他展示如何访问我们的C API。

但是是否甚至可以同时使用 Cython 和 PyQt4。 似乎没有多大意义,Qt 是 C 或 C++ 而 PyQt 是使用 Qt 的绑定或包装器使用 Python 然后我们使用 Cython 将 Python 代码更改为 C 代码。但是,尽管它没有意义,并且可能会减慢一切速度,但它甚至可能吗?如果可能的话,我将提供这个作为临时解决方案。

【问题讨论】:

  • 为什么不试试看呢?
  • 好点,我计划今天这样做,但我想在我花更多时间学习 Cython 之前从社区获得一些建议。在将 C 和 Python 结合使用的领域中似乎有无穷无尽的选择,要找到最佳方法是压倒性的。
  • 对您的结果发表评论或解决方案更新怎么样?
  • @Nelson 我在暑假的实习期间从事这项工作。我还没来得及解决问题,实习就结束了。

标签: python pyqt4 cython


【解决方案1】:

我这样做是为了快速解决问题,将 QImage 传递给以下函数:

cpdef void export_array(object image, int[:] colorList, int[:] dim, int[:, :] arr, int color_offset):
    """
    Updates the image with the values from an entire array.

    :param image:           A QImage object to be written to
    :param colorList:       List of colors, as integers
    :param dim:             Dimensions of the array
    :param array:           Array to use as new image
    :param color_offset:    Use primary colors (0) or secondary colors (2)?
    :return:                None
    """
    cdef int color
    cdef Py_ssize_t i, j
    cdef int a = dim[0]
    cdef int b = dim[1]
    for i in range(a):
        for j in range(b):
            color = colorList[arr[i][j] + color_offset]
            image.setPixel(i, j, color)

速度快了一个数量级:

%timeit cf.export_array(image, colorList, imageDim, arr, 2)
%timeit pf.export_array(image, colorList, arr, 2)
507 ms ± 730 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
3.38 s ± 22.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

虽然我尝试使用的另一个功能减慢了大约 10%。在这种情况下,嵌套的 for 循环使其成为一个很好的候选对象。

(我认为自从您发布此问题以来,您的问题已经发生了很大变化,但也许这个答案可以帮助其他当代谷歌员工。)

【讨论】:

  • (我也知道我应该直接使用 QImage(或 QPixmap)中的字节编辑内容将我的数组用作图像,我会考虑它 :)
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2010-11-23
  • 2011-10-21
  • 2011-11-26
相关资源
最近更新 更多