gpt4 book ai didi

python - 如何在 Python 中使用具有复杂类型的 C 函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:43 25 4
gpt4 key购买 nike

我决定将我的一些 Python 函数移植到 C,主要遵循 this simple tutorial .问题是我的 C 函数返回一个复杂的 float ,并且在 ctypes 的 documentation 中没有对应的类型.这是我在跨语言编码和 C 知识有限的情况下无法解决的问题,即使通过 Google 扩展也是如此。

我的 C 函数是这样工作的:

#include <tgmath.h>
float _Complex integrand(float _Complex theta1, double r, double z){
//[code] }

因此,根据教程,相应的 Python 包装器(可能)应该是这样的:

complextype = '??????'

_integr = ctypes.CDLL('libintegrand.so')
_integr.integrand.argtypes = (complextype, ctypes.c_double, ctypes.c_double)

def integrand(theta1, r, z):
global _integr
result = _integr.integrand(complextype(theta1), ctypes.c_double(r), ctypes.c_double(z))
return float(result)

但是这个类型应该是什么?我应该怎么做?

如果函数也有一个复杂的参数使它变得更加复杂,请忽略复杂的参数。

最佳答案

创建一个小的 C 包装函数:

void integrand_wrapper(float *re, float *im, double r, double z)
{
float _Complex result;
float _Complex theta = (*re) + I*(*im);
result = integrand(theta, r, z);
(*re) = creal(result);
(*im) = cimag(result);
}

reim 指针在调用时保存 theta 的实部和虚部,之后保存结果的实部和虚部.

在您的 Python 代码中,使用例如调用 integrand_wrapper()

def integrand(theta, r, z):
global _integr
theta = complex(theta)
re = c_float(theta.real)
im = c_float(theta.imag)
_integr.integrand_wrapper(byref(re), byref(im), c_double(r), c_double(z))
return complex(float(re), float(im))

请注意,如果 integrand() 是在您无法修改的二进制库中定义的,您始终可以创建另一个仅包含 integrand_wrapper 的动态库,它是动态链接的(在C) 到原始二进制库。

总的来说,我认为增加的开销一点也不重要。这当然值得测试。

关于python - 如何在 Python 中使用具有复杂类型的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51575212/

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