gpt4 book ai didi

c - 同一 C 库的多个 cython 使用者

转载 作者:行者123 更新时间:2023-11-30 14:49:13 27 4
gpt4 key购买 nike

我想使用 sage 和外部 c 库。外部库已经具有用 cython 编写的 python 绑定(bind),并处理 python 的数字类和 gmp 整数之间的转换。

为了使其能够与 sage 一起使用,我想绕过该转换:sage 整数已经在底层使用了 gmp。但为了让我的代码编译(和工作),我在任何地方都使用了显式类型转换,我认为应该有更好的方法来做到这一点。如果我能整理代码,我希望最终将其上游到 Sage。

在 sage 中,整数类型 (mpz_t) 的 gmp 绑定(bind)在 pxd 文件中声明,如下所示:

ctypedef struct __mpz_struct:
int _mp_alloc
int _mp_size
mp_ptr _mp_d

ctypedef __mpz_struct mpz_t[1]

但是外部库有自己的 gmp pxd 并声明:

ctypedef struct mpz_t:
pass

在我的代码中在 sage.mpz_tmylib.mpz_t 之间手动转换工作正常,但是将 mylib 的绑定(bind)重写为使用 Sage 的 gmp 绑定(bind)而不是它自己的?我想是的,但是怎么样呢?

gmp 中的函数签名之间也存在不一致的情况,例如在圣人中:

void mpz_set (mpz_t rop, mpz_t op)

但是在mylib中,出现了一个狂野的const:

void mpz_set(mpz_t rop, const mpz_t op)

我有一个预感,sage 和 mylib 之间的区别在于 mylib 将 mpz_t 视为不透明的结构,但 sage 深入研究了实现。我对低级 C 没有真正的经验,因此任何对我可以用来自学这方面 Material 的引用都将不胜感激。

最佳答案

您无需担心签名的差异 - 对于 cdef extern 声明,Cython 只需要了解足够的信息即可正确调用 C 代码。因此,const 的存在/不存在对 Cython 来说几乎没有什么影响。同样,如果您不从 Cython 使用结构体中的所有字段,则无需声明它们。

如果您准备更改“mylib”代码以使用 sage 声明,那么这很简单 - 只需使用 cimport。我相信正确的导入应该是

from sage.libs.gmp.types cimport mpz_t

(这依赖于 Python 路径上安装的 sage .pxd 文件。)对您要使用的函数执行类似的操作。

关于c - 同一 C 库的多个 cython 使用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49823300/

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