我正在尝试用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之外还有其他方法可以提供更好的性能吗?
欢迎任何其他加速此功能的建议:)