如何直接从 Cython 调用 numpy/scipy C 函数,而不需要 Python 调用开销?

2024-04-11

我正在尝试在 Cython 中进行计算,该计算严重依赖于一些 numpy/scipy 数学函数,例如numpy.log。我注意到,如果我在 Cython 中的循环中重复调用 numpy/scipy 函数,则会产生巨大的开销,例如:

import numpy as np
cimport numpy as np
np.import_array()
cimport cython

def myloop(int num_elts):
   cdef double value = 0
   for n in xrange(num_elts):
     # call numpy function
     value = np.log(2)

这是非常昂贵的,大概是因为np.log通过Python而不是直接调用numpy C函数。如果我将该行替换为:

from libc.math cimport log
...
# calling libc function 'log'
value = log(2)

然后就快多了。但是,当我尝试将 numpy 数组传递给 libc.math.log 时:

cdef np.ndarray[long, ndim=1] foo = np.array([1, 2, 3])
log(foo)

它给出了这个错误:

TypeError: only length-1 arrays can be converted to Python scalars

我的问题是:

  1. 是否可以调用 C 函数并向其传递一个 numpy 数组?或者它只能用于标量值,这需要我编写一个循环(例如,如果我想将其应用于foo上面的数组。)
  2. 是否有类似的方法可以直接从 C 调用 scipy 函数而无需 Python 开销?如何导入 scipy 的 C 函数库?

具体示例:假设您想调用许多 scipy 或 numpy 的有用统计函数(例如scipy.stats.*) 对 a 内的标量值forCython 中的循环?在 Cython 中重新实现所有这些函数是疯狂的,因此必须调用它们的 C 版本。例如,与 pdf/cdf 相关的所有函数以及来自各种统计分布的采样(例如,参见http://docs.scipy.org/doc/scipy/reference/ generated/scipy.stats.rv_continuous.pdf.html#scipy.stats.rv_continuous.pdf http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.pdf.html#scipy.stats.rv_continuous.pdf and http://www.johndcook.com/distributions_scipy.html http://www.johndcook.com/distributions_scipy.html)如果您在循环中使用 Python 开销调用这些函数,速度会非常慢。

thanks.


您无法在 numpy 数组上应用 log 等 C 函数,并且 numpy 没有可以从 cython 调用的 C 函数库。

Numpy 函数已经经过优化,可以在 numpy 数组上调用。除非您有非常独特的用例,否则您不会从将 numpy 函数重新实现为 C 函数中获得太多好处。 (numpy 中的某些函数可能没有很好地实现,在这种情况下请考虑将您的输入作为补丁提交。)但是您确实提出了一个很好的观点。

# A
from libc.math cimport log
for i in range(N):
    r[i] = log(foo[i])

# B
r = np.log(foo)

# C
for i in range(n):
    r[i] = np.log(foo[i])

一般来说,A 和 B 应该有相似的运行时间,但 C 应该避免,并且会慢很多。

Update

这是 scipy.stats.norm.pdf 的代码,您可以看到它是用 python 编写的,带有 numpy 和 scipy 调用。该代码没有 C 版本,您必须“通过 python”调用它。如果这是阻碍您的原因,您需要将其重新植入 C/Cython 中,但首先我会花一些时间非常仔细地分析代码,看看是否有任何容易实现的目标。

def pdf(self,x,*args,**kwds):
    loc,scale=map(kwds.get,['loc','scale'])
    args, loc, scale = self._fix_loc_scale(args, loc, scale)
    x,loc,scale = map(asarray,(x,loc,scale))
    args = tuple(map(asarray,args))
    x = asarray((x-loc)*1.0/scale)
    cond0 = self._argcheck(*args) & (scale > 0)
    cond1 = (scale > 0) & (x >= self.a) & (x <= self.b)
    cond = cond0 & cond1
    output = zeros(shape(cond),'d')
    putmask(output,(1-cond0)+np.isnan(x),self.badvalue)
    if any(cond):
        goodargs = argsreduce(cond, *((x,)+args+(scale,)))
        scale, goodargs = goodargs[-1], goodargs[:-1]
        place(output,cond,self._pdf(*goodargs) / scale)
    if output.ndim == 0:
        return output[()]
    return output
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何直接从 Cython 调用 numpy/scipy C 函数,而不需要 Python 调用开销? 的相关文章

  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • 是否可以将 cython 函数作为参数传递给 scipy 函数?

    Scipy 有许多函数接受 python 可调用来执行某些操作 特别是 我正在使用数学优化函数scipy optimize leastsq接受 Python 可调用作为目标函数参数 该目标函数可以通过以下方式调用leastsq在最小化过程中
  • 是否可以强制浮点数的指数或有效数匹配另一个浮点数(Python)?

    这是我前几天试图解决的一个有趣的问题 是否可以强制一个的有效数或指数float与另一个人一样float在Python中 出现这个问题是因为我试图重新调整一些数据 以便最小值和最大值与另一个数据集匹配 然而 我重新调整后的数据略有偏差 大约小
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们

随机推荐

  • Python 单元测试输出数据

    如果我用 Python 编写单元测试 使用 unittest 模块 是否可以输出失败测试的数据 以便我可以检查它以帮助推断导致错误的原因 我知道创建自定义消息的能力 它可以携带一些信息 但有时您可能会处理更复杂的数据 这些数据无法轻松表示为
  • 代号 1 个 JavaScript 回调

    我正在尝试在我的应用程序中显示同意页面 该页面应该用 html 编写 因此应用程序需要处理来自浏览器的按钮单击事件 我尝试复制博客中的例子 https www codenameone com blog new async java java
  • 如何将自定义图形适合boost图形库模板?

    我对 C 模板很生疏 而且我正在使用 boost 图形库 一个致命的组合 我在网上搜索过 但找不到任何关于如何采用自定义图形结构并将其足够适合 BGL 增强图形库 的直接说明 以便我可以使用增强图形遍历算法 有熟悉图书馆的人可以帮助我吗 编
  • 我可以更改 Firebug 控制台背景颜色吗?

    我更喜欢 Firebug 窗口具有深色背景颜色和浅色文本 或者甚至只是灰色背景而不是白色就足够了 有什么办法可以做到这一点 无论是通过调整 firebug 的原始文件还是通过使用扩展 这是一个不错的 firebug 深色主题 仅适用于 Fi
  • Visual Studio 错误:已添加具有相同键的项目

    当我尝试更改控件的默认图像时在 Windows 窗体上在表单设计器中 无论在哪个控件上的哪个位置 我收到此错误 错误消息 具有相同的项目 密钥已经添加 我尝试删除并重新创建资源 resx文件 我保证只有 1 个带有这些键的 resx 文件存
  • 在 PHP 8 上安装 apcu_bc 包时遇到问题

    安装包时遇到以下错误pecl install apcu bc在 PHP 8 上 In file included from tmp pear temp apcu bc php apc c 35 usr local include php e
  • 如何从滚动视图中删除子视图?

    我如何从滚动视图中删除所有子视图 我在滚动视图中有一个 uiview 和它上面的一个按钮 像这样 这是我在滚动视图中添加子视图的代码 void AddOneButton NSInteger myButtonTag lastButtonNum
  • java.util.regex.Pattern 可以进行部分匹配吗?

    是否可以知道流 字符串是否包含以下输入 could匹配正则表达式 例如 String input AA Pattern pat Pattern compile AAAAAB Matcher matcher pat matcher input
  • 按名称访问 ResourceDictionary

    假设我的 Application xaml 中有一些 ResourceDictionary 定义如下
  • django-reversion 撤消功能 - 恢复多个对象

    我正在尝试使用 django reversion 在 django 项目中实现 撤消 功能 以防用户意外修改多个对象 使用管理面板不起作用 因为必须一一恢复对象 我的问题是我无法创建包含多个对象数据的修订版本 即使当我这样做时 with r
  • React + Antd + Rollup 组件库“错误:无效的钩子调用。钩子只能在函数组件体内调用”

    我目前正在构建一个 UI 库来简化跨多个应用程序的维护 这些目前使用 Ant Design 一切似乎都很顺利 我在两者中都添加了我的对等依赖项package json and rollup config js 通过外部 我能够让 Rollu
  • 来自 Parcel.readException 的 NullPointerException (等)

    看起来像这样的异常令人困惑 FATAL EXCEPTION main java lang NullPointerException at android os Parcel readException Parcel java 1437 at
  • 导航抽屉 - 带 ListView 的标题视图

    我目前正在创建和定义一个导航抽屉 我现在想要一个标题视图 就像它们在谷歌应用程序上一样 位于项目行上方 我只找到了 RecyclerViews 的示例 但我不想使用它 我已经完成了 ListView 和所有其他东西 也许有人可以帮助我 提前
  • 如何在循环中使用链式构建器模式而不产生编译器错误?

    如何正确使用期望的构建器模式方法链接 https en wikipedia org wiki Method chaining在循环中 使用来自的示例log4rs https crates io crates log4rs 注意self不是一
  • MySQL 加入最大值

    通过在 Entry id 上加入下面的表格 我想从 food brands 表中提取具有最高 type id 的行 所以我应该得到下面的前 3 行 其中 type id 为 11940 食品品牌 id brand type id 15375
  • Python正则表达式,如何删除字符串中的所有匹配项

    我有一个正则表达式模式列表 rgx list pattern 1 pattern 2 pattern 3 我正在使用一个函数来循环列表 编译正则表达式 并应用findall获取匹配的术语 然后我想要一种从文本中删除所述术语的方法 def c
  • 从 mysql 数据库填充 Php 下拉列表[重复]

    这个问题在这里已经有答案了 我正在尝试从 mysql 数据库表填充下拉列表 这是代码 div class form group Select Make div
  • URL 缩短器:最佳编码方法?

    我正在创建一个链接缩短服务 并使用增量 ID 字段的 Base64 编码 解码来创建我的 url ID 为 6 的 url 为 http mysite com Ng http mysite com Ng 我还需要允许用户创建自定义网址名称
  • 来自模型和控制器的 cakephp 验证

    我已经在模型中进行了验证 另外 我在控制器中进行了一些验证以检查验证码 此后 应用程序不再显示模型验证错误 如果我评论控制器代码 模型验证工作正常并显示错误 两个都不行 型号代码 示例 class User extends AppModel
  • 如何直接从 Cython 调用 numpy/scipy C 函数,而不需要 Python 调用开销?

    我正在尝试在 Cython 中进行计算 该计算严重依赖于一些 numpy scipy 数学函数 例如numpy log 我注意到 如果我在 Cython 中的循环中重复调用 numpy scipy 函数 则会产生巨大的开销 例如 impor