我是NumPy 的C 扩展的新手,我想知道以下作业流程是否可行。
- 在 NumPy 中预分配一个阵列
- 将此阵列传递给 C 扩展
- 在 C 中就地修改阵列资料
- 在标准 NumPy 函式中使用 Python 中更新的阵列
特别是,我想这样做,同时确保我在任何步骤都制作零个新的资料副本。
我熟悉的C面的样板,如PyModuleDef
,PyMethodDef
和PyObject*
论点,但很多我见过的涉及强迫到我的理解涉及复制和/或铸件C阵列的例子。我也知道 Cython,但我不知道它是否在引擎盖下进行了类似的强制或复制。我对ndarray
使用数字(例如int32
)值进行的简单索引获取和设定操作特别感兴趣。
有人可以提供一个创建 NumPy 阵列、在 C 扩展中就地修改它并随后在 Python 中使用结果的最小作业示例吗?
uj5u.com热心网友回复:
Cython 不会创建 numpy 阵列的新副本,除非您使用 numpy 函式特别要求它这样做,因此它在处理 numpy 阵列时尽可能高效,请参阅使用 NumPy
在撰写原始 C 模块和使用 cython 之间进行选择取决于撰写模块的目的。如果您正在撰写一个仅由 python 使用的模块来尽快使用 numpy 阵列执行非常小的特定任务,那么一定要使用 cython,因为它会自动正确注册模块并处理存储器并防止人们在撰写 C 代码时犯的常见错误(如存储器管理问题),以及自动化编译器包含并允许更轻松地访问复杂的功能(如使用 numpy 迭代器)。
但是,如果您的模块要在其他语言中使用并且必须独立于 python 运行并且必须在没有任何开销的情况下与 python 一起使用,并且实作了一些复杂的 C 资料结构并需要大量的 C 功能,那么一定要创建你自己的 C 扩展(甚至是一个 dll),你可以从 python 传递指向 numpy 阵列的指标(使用numpy.ctypeslib.as_ctypes_type),或者传递 python 物件本身并回传它(但你必须创建一个 .pyd/so dll),或者甚至在 C 端创建 numpy 阵列并由 python 管理它(但你必须了解numpy C API)。
0 评论