使用ctypes改进函数调用的性能

时间:2017-10-24 02:18:39

标签: python c++ performance optimization ctypes

我正在尝试用python代码调用用C ++编写的函数,我使用的方法是ctypes。这就是我如何做包装器:

def render(vertex, tri, texture, src_img):

    cRenderer = ctypes.cdll.LoadLibrary("renderer.so")

    cvertex = ((ctypes.c_double * len(vertex))(*vertex))
    nver = int(vertex.shape[0] / 3)

    ntri = tri.shape[0]
    tri = np.hstack(tri)
    ctri = ((ctypes.c_double * len(tri))(*tri))

    texture = np.hstack(texture)
    ctexture = ((ctypes.c_double * len(texture))(*texture))

    width = src_img.shape[0]
    height = src_img.shape[1]
    nChannels = src_img.shape[2]

    src_img = np.hstack(np.hstack(src_img))
    csrc_img = ((ctypes.c_double * len(src_img))(*src_img))

    cimg = ((ctypes.c_double * len(src_img))(*src_img))

    cRenderer.render(cvertex, ctri, ctexture, nver, ntri,
    csrc_img, width, height, nChannels, cimg)

    img = np.array(cimg).reshape(nChannels, height*width)

    return img.reshape(width, height, nChannels)

C ++函数采用顶点,三角形,纹理,一些数字和输入/输出图像的数组。

我以最原始的方式编写代码,因为这是我第一次使用ctypes。 当我开始进行一些分析时,我发现该函数大部分时间都在转换数组,例如:

cvertex = ((ctypes.c_double * len(vertex))(*vertex))

有没有办法以更有效的方式将其转换为可通过的参数? 除了ctypes之外还有其他方法可以提供更好的性能吗?

欢迎任何其他加速此功能的建议:)

0 个答案:

没有答案