为什么 cffi 比 numpy 快这么多?

2024-01-03

我一直在尝试用 python 编写 cffi 模块,它们的速度让我想知道我是否正确使用了标准 python。这让我想彻底转向C!说实话,有一些很棒的 python 库我永远无法用 C 重新实现自己,所以这比任何实际情况都更假设。

此示例显示了 python 中的 sum 函数与 numpy 数组一起使用,以及与 c 函数相比它的速度有多慢。有没有更快的 pythonic 方法来计算 numpy 数组的总和?

def cast_matrix(matrix, ffi):
    ap = ffi.new("double* [%d]" % (matrix.shape[0]))
    ptr = ffi.cast("double *", matrix.ctypes.data)
    for i in range(matrix.shape[0]):
        ap[i] = ptr + i*matrix.shape[1]                                                                
    return ap 

ffi = FFI()
ffi.cdef("""
double sum(double**, int, int);
""")
C = ffi.verify("""
double sum(double** matrix,int x, int y){
    int i, j; 
    double sum = 0.0;
    for (i=0; i<x; i++){
        for (j=0; j<y; j++){
            sum = sum + matrix[i][j];
        }
    }
    return(sum);
}
""")
m = np.ones(shape=(10,10))
print 'numpy says', m.sum()

m_p = cast_matrix(m, ffi)

sm = C.sum(m_p, m.shape[0], m.shape[1])
print 'cffi says', sm

只是为了展示该功能的工作原理:

numpy says 100.0
cffi says 100.0

现在,如果我对这个简单的函数进行计时,我发现 numpy 真的很慢! 我是否以正确的方式使用 numpy ?有没有更快的方法来计算Python中的总和?

import time
n = 1000000

t0 = time.time()
for i in range(n): C.sum(m_p, m.shape[0], m.shape[1])
t1 = time.time()

print 'cffi', t1-t0

t0 = time.time()
for i in range(n): m.sum()
t1 = time.time()

print 'numpy', t1-t0

times:

cffi 0.818415880203
numpy 5.61657714844

Numpy 比 C 慢有两个原因:Python 开销(可能类似于 cffi)和通用性。 Numpy 旨在处理多种不同数据类型的任意维度的数组。您使用 cffi 的示例是针对二维浮点数组制作的。成本是写几行代码 vs.sum(),6个字符保存时间小于5微秒。 (但是当然,您已经知道这一点)。我只是想强调 CPU 时间很便宜,比开发人员时间便宜得多。

现在,如果你想坚持使用 Numpy,并且想要获得更好的性能,最好的选择是使用瓶颈 https://github.com/kwgoodman/bottleneck。它们提供了一些针对浮点和双精度的一维和二维数组优化的函数,并且速度非常快。在你的例子中,速度快了 16 倍,这将使执行时间缩短 0.35,或者大约是 cffi 的两倍。

对于bottleneck没有的其他功能,可以使用Cython。它可以帮助您使用更Pythonic 的语法编写C 代码。或者,如果您愿意,可以逐步将 Python 转换为 C,直到您对速度感到满意为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 cffi 比 numpy 快这么多? 的相关文章

随机推荐

  • Safari:在卸载之前

    前提条件 你应该在狩猎10 您好 我在请假时遇到困难 保持确认框在不同浏览器中显示在我的页面上 请前往https www biznessapps com cms https www biznessapps com cms 并使用以下凭据登录
  • 在 Chrome 中使用 window.location.reload 从缓存加载和哈希片段不起作用

    我需要用 Javascript 重新加载页面 我用window location reload为了这个目的 现在 我在 Chrome 中观察到一个奇怪的行为 Chrome 总是连接到服务器并询问文档是否被修改 虽然一个304 Not Mod
  • 重新创建 iOS 7 日历 UIView 动画

    每个人都知道 iOS 7 日历应用程序中全新的精彩动画 您可以在这段短视频中看到它们 http vimeo com 69247779 http vimeo com 69247779 我会重新创建类似的东西 创建一个 模式 矩形 当用户点击时
  • 在 ios 7.1 中自定义按钮形状

    苹果已经添加了纽扣形状 http www todaysiphone com 2014 03 switch button shapes ios 7 1 iOS 7 1 中的功能 但我需要让它在我的应用程序中禁用或更改其默认颜色 形状以匹配我的
  • 关于 Android 活动

    我面临着一个与相关的大问题Activity 我的场景如下 我启动活动 A 单击一个按钮 然后从图库中选择一张图像 然后在onActivityResult我打了电话startActivity B 现在 在我的活动 B 中 A 中选择的图像已显
  • AVL树的最小节点数?

    我知道AVL树中最小节点数的公式是 S h S h 1 S h 2 1 然而 我真的不知道如何使用这个函数 假设我们的 AVL 高度为 6 答案告诉我最小值 7 4 1 12 但是你如何得到这个数字呢 我的意思是 当你插入 6 时 不是 6
  • 函数对象属性 __kwdefaults__ 有什么用?

    函数对象有属性 defaults and kwdefaults 我发现如果一个函数有一些默认参数 那么它们将作为一个元组放入 defaults but kwdefaults is None 何时使用属性 kwdefaults def foo
  • 尝试使用 os.makedirs 时出现“OSError:[Errno 17] 文件存在”[重复]

    这个问题在这里已经有答案了 我在集群系统上有几个从 Python 并行运行的线程 每个Python线程输出到一个目录mydir 每个脚本在输出之前检查是否mydir存在 如果不存在则创建它 if not os path isdir mydi
  • 汇编“下面”是否有编程语言? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 防止 CHARACTER VARYING 字段中出现空字符串

    我正在使用 PostgreSQL 并希望阻止某些必需的 CHARACTER VARYING VARCHAR 字段允许空字符串输入 这些字段还需要包含唯一值 因此我已经使用了唯一约束 但是 这并不能阻止原始 唯一 空值 基本示例 其中用户名需
  • 如何使用 MFC 应用程序 (C++ Visual Studio 2010) 中的按钮更改图像的可见属性?

    我正在尝试制作一个程序 当按下应用程序中某个名为 隐藏 的按钮时 图像就会消失 我知道在 Windows 窗体应用程序中它会是这样的 pictureBox1 gt Visible true false 但该代码在 MFC 中不起作用 我在M
  • 函数指针有什么用,我将如何使用它们?

    我知道我可以使用函数指针 有人可以解释为什么要使用它们以及如何使用它们吗 简短的示例代码对我非常有帮助 一个简单的情况是这样的 根据您的业务逻辑 您有一系列操作 函数 您有一个哈希函数 可以将输入问题减少到业务逻辑函数之一 干净的代码将具有
  • 可以在 Node.JS Express 应用程序中插入中间件吗

    有没有办法在 Express 堆栈中注入中间件 我的意思是我想让我的 app js 设置主中间件链 然后调用传递应用程序实例的其他模块 他们可能想要插入更多中间件 例如想要在正确位置添加护照的身份验证模块 你一定可以通过你的app对象其他模
  • 从 Option[] 包装的对象中读取多个变量

    我有一个变量obj Option MyObject 并希望从中提取多个变量 如果未设置对象 则应使用默认值 目前我是这样做的 val var1 obj match case Some o gt e var1 case gt default1
  • 如何通过包含部分字符串的组件名称查询组件

    我想用Ext ComponentQuery query 查询包含某个名称路径的按钮名称 假设我有 4 个按钮 名称声明为 edit btn add btn add2 btn 和 edit2 btn 然后我使用查询 Ext Component
  • Sass --watch 不重新编译

    Sass 更新了我的主样式表build css当我将更改保存到build scss 但不会更新build css例如 当我保存对任何部分的更改时 grid settings scss 我基本上必须手动重新保存build scss每次我对部分
  • 如何在西门子 S7-1200 和 python 之间进行通信?

    我正在 S7 1200 plc 上运行一个进程 我需要它向我的 python 脚本发送启动信号 脚本运行完成后 需要将一些内容发送回 plc 以启动下一阶段 哦 它必须在梯子上完成 有没有一种快速而肮脏的方式通过profibus发送东西 或
  • 如何在 Sublime Text 2 中删除包

    我想删除和 或停用EmmetSublime Text 2 中的包 我应该删除Emmet目录或删除包的典型工作流程是什么 If you installed with package control search for Package Con
  • 未找到符号,应位于:平面命名空间

    我有一个巨大的gl pxd包含所有定义的文件gl h glu h and glut h 例如它有这些行 cdef extern from
  • 为什么 cffi 比 numpy 快这么多?

    我一直在尝试用 python 编写 cffi 模块 它们的速度让我想知道我是否正确使用了标准 python 这让我想彻底转向C 说实话 有一些很棒的 python 库我永远无法用 C 重新实现自己 所以这比任何实际情况都更假设 此示例显示了