拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 从C扩展操作Numpy阵列,无需存储器复制

从C扩展操作Numpy阵列,无需存储器复制

白鹭 - 2022-02-12 2155 0 0

我是NumPy 的C 扩展的新手,我想知道以下作业流程是否可行。

  1. 在 NumPy 中预分配一个阵列
  2. 将此阵列传递给 C 扩展
  3. 在 C 中就地修改阵列资料
  4. 在标准 NumPy 函式中使用 Python 中更新的阵列

特别是,我想这样做,同时确保我在任何步骤都制作零个新的资料副本

我熟悉的C面的样板,如PyModuleDefPyMethodDefPyObject*论点,但很多我见过的涉及强迫到我的理解涉及复制和/或铸件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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *