gpt4 book ai didi

python - PyQt4 与 Cython = 坏主意?

转载 作者:行者123 更新时间:2023-11-28 18:42:06 33 4
gpt4 key购买 nike

我的工作中有人使用 PyQt4 编写了一些 python 模块.我写了一个Jython本应允许 Python 模块访问我们 API 的 Java 绑定(bind)的应用程序,但我没有意识到 Jython 无法使用 ctypes因此整个应用程序基本上是无用的。

我正在努力寻找一个解决方案,告诉我如何将我们的 API 公开给他的 Python 模块。我们的 API 是 C 语言并且具有 C++ 绑定(bind)(以及 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 的绑定(bind)或包装器使用 Python 然后我们使用 Cython 将 Python 代码更改为 C 代码。但是,尽管它没有意义并且可能会减慢一切速度,但它甚至有可能吗?如果可能,我将提供此作为临时解决方案。

最佳答案

我这样做是为了快速解决问题,将 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 循环使其成为一个很好的候选者。

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

关于python - PyQt4 与 Cython = 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983128/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com