Cythonized 函数出乎意料地慢

2024-03-18

我想加快我经常使用的功能,并且我考虑使用 cython。然而,在尝试了我在文档中找到的所有可能的 cython 优化之后,cython 代码比 python+numpy 函数慢大约 6 倍。令人失望!

这是我的测试代码:(forward1是python函数,forward2是cython函数)

#geometry.py
def forward1(points, rotation, translation):
    '''points are in columns'''
    return np.dot(rotation, points - translation[:, np.newaxis])

#geometry.pyx
import numpy as np
cimport numpy as np
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
cdef np.float64_t[:,:] forward2(np.float64_t[:,:] points, np.float64_t[:,:] rotation, np.float64_t[:] translation):
    '''points are in columns'''
    cdef unsigned int I, J
    I = points.shape[0]
    J = points.shape[1]
    cdef np.float64_t[:,:] tmp = np.empty((I, J), dtype=np.float64)
    cdef unsigned int i
    for i in range(J):
        tmp[0, i] = points[0, i] - translation[0]        
        tmp[1, i] = points[1, i] - translation[1]        
    cdef np.float64_t[:,:] result = np.dot(rotation, tmp)
    return result

def test_forward2(points, rotation, translation):
    import timeit
    cdef np.float64_t[:,:] points2 = points
    cdef np.float64_t[:,:] rotation2 = rotation
    cdef np.float64_t[:] translation2 = translation
    t = timeit.Timer(lambda: forward2(points2, rotation2, translation2))
    print min(t.repeat(3, 10))

然后我计时:

t = timeit.Timer(lambda: forward1(points, rotation, translation))
print min(t.repeat(3, 10))
0.000368164520751

test_forward2(points, rotation, translation)
0.0023365181969

我可以对 cython 代码做些什么来使其更快吗?

如果forward1无法在cython中加速,我可以希望使用weave加速吗?

EDIT:

仅供记录,我尝试加快该功能的另一件事是按 Fortran 顺序传递点,因为我的点存储在列中,并且其中有相当多的列。我还将本地 tmp 定义为 fortran 命令。我认为函数的减法部分应该更快,但 numpy.dot 似乎需要 C 阶输出(无论如何要解决这个问题?),所以总的来说,这也没有加速。我还尝试转置这些点,以便减法部分在 C 顺序中更快,但似乎点积仍然是最昂贵的部分。

另外,我注意到 numpy.dot 不能使用内存视图作为输出参数,即使它是 C 顺序,这是一个错误吗?


只要看一下你的代码,它看起来就像是(数组和点积的减法。)numpy已经非常优化了。

Cython 非常适合加速 numpy 通常表现不佳的情况(例如,迭代是用 python 编写的迭代算法),但在这种情况下,内部循环已经由 BLAS 库执行。

如果你想加快速度,我首先要看看 numpy 链接的 BLAS/LAPACK/ATLAS/etc 库。在这种情况下,使用“经过调整的”线性代数库(例如 ATLAS 或 Intel 的 MKL)将会产生很大的差异(在某些情况下 >10 倍)。

要了解您当前正在使用什么,请查看以下输出numpy.show_config()

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

Cythonized 函数出乎意料地慢 的相关文章

  • ValueError:“连接”层需要具有匹配形状的输入(连接轴除外)

    我正在尝试为我的项目构建 Pix2Pix 并收到错误 值错误 Concatenate层需要具有匹配形状的输入 除了连接轴之外 获得输入形状 None 64 64 128 None 63 63 128 生成器是一个 U 网模型 我的输入高度
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • 带括号的上下文管理器

    我试图了解新的新内容带括号的上下文管理器Python 3 10 中的功能 新功能中的顶部项目here https docs python org 3 10 whatsnew 3 10 html 我的测试示例是尝试编写 with open f
  • Python 小数.InvalidOperation 错误

    当我运行这样的东西时 我总是收到此错误 from decimal import getcontext prec 30 b 2 3 Decimal b Error Traceback most recent call last File Te
  • 通过鼻子测试检查某个函数是否发出警告

    我正在使用编写单元测试nose http somethingaboutorange com mrl projects nose 0 11 2 我想检查函数是否引发警告 该函数使用warnings warn 这是很容易就能做到的事情吗 def
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 使用字母而不是数字进行顺序计数[重复]

    这个问题在这里已经有答案了 我需要一种方法 将字符串 递增 到 z 然后将 aa 递增到 az 然后将 ba 递增到 bz 依此类推 就像 Excel 工作表中的列一样 我将向该方法提供前一个字符串 它应该增加到下一个字母 PSEUDO C
  • Selenium Webdriver - Python - leboncoin - pb 选择带重音的按钮

    我正在尝试在以下网站上自动填写表格 https www leboncoin fr https www leboncoin fr 我用 Selenium IDE 录制了一个脚本 我有一个通过单击 Se 连接器 按钮并填写我的密码和用户名来自动
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • Python 垃圾收集有时在 Jupyter Notebook 中不起作用

    我的一些 Jupyter 笔记本经常出现 RAM 不足的情况 而且我似乎无法释放不再需要的内存 这是一个例子 import gc thing Thing result thing do something thing None gc col
  • 为 Python 2.4 改进“with”语句的直接替换

    您能否建议一种方法来编写可在 Python 2 4 中使用的 with 语句的直接替换代码 这将是一个 hack 但它可以让我更好地将我的项目移植到 Python 2 4 EDIT 删除了不相关的元类草图 只需使用 try finally
  • x11 - 导入错误:没有名为“kivy.core.window.window_x11”的模块

    目前我正在尝试构建一个我通过 buildozer 用 Python 和 Kivy 编写的应用程序 无论我在做什么 我都会遇到 window x11 的问题 即使我在代码中注释掉所有与 Windows 相关的内容或执行本文中描述的所有操作 这
  • PyQt - 如何检查 QDialog 是否可见?

    我有个问题 我有这个代码 balls Ball for i in range 1 10 因此 当我说 Ball 时 这将在 QDialog 上绘制一个球 然后当这完成后 我正在移动球QDialog无限循环中 我想说类似的话while QDi
  • Flask SQLAlchemy 与 MyPy - 模型类型错误

    我遇到了以下组合问题flask sqlalchemy and mypy 当我定义一个新的 ORM 对象时 例如 class Foo db Model pass where db是使用创建的数据库SQL炼金术应用于flask app mypy
  • 如何使用数据库在 Django 中的应用程序之间交换数据?

    我正在使用 Django 在网络上工作 我创建了 2 个应用程序 第一个用于客户端注册并将其数据添加到数据库 第二个应用程序供用户访问和查看交互界面 这个想法是使用第二个应用程序从数据库中的客户端获取数据 并使用它向用户显示一些信息 我的问
  • 如何将 pytest 装置与 django TestCase 一起使用

    我如何在TestCase方法 类似问题的几个答案似乎暗示我的例子应该有效 import pytest from django test import TestCase from myapp models import Category py
  • 从 Python 中编译的正则表达式中提取命名组正则表达式模式

    我有一个 Python 正则表达式 其中包含多个命名组 但是 如果先前的组已匹配 则可能会错过与一组匹配的模式 因为似乎不允许重叠 举个例子 import re myText sgasgAAAaoasgosaegnsBBBausgisego
  • 在读/写二进制数据结构时访问位域

    我正在为二进制格式编写一个解析器 这种二进制格式涉及不同的表 这些表同样采用二进制格式 通常包含不同的字段大小 其中 50 100 个之间 大多数这些结构都有位域 并且在 C 语言中表示时看起来像这样 struct myHeader uns
  • Shap - 颜色条不显示在摘要图中

    显示summary plot时 不显示颜色条 shap summary plot shap values X train 我尝试过改变plot size 当绘图较高时 会出现颜色条 但它非常小 看起来不应该 shap summary plo

随机推荐

  • array_walk 匿名函数

    有没有办法让我用匿名函数来获取这个数组来设置值 url array dog cat fish array walk url function value key url key str replace dog value echo pre
  • Azure CLI 运行命令使用参数调用 RunPowerShellScript

    我一直在尝试在 Azure VM 上运行一个脚本 该脚本需要像这样传递参数 az vm run command invoke g
  • scikit learn:与 GridSearchCV 兼容的自定义分类器

    我已经实现了自己的分类器 现在我想对其运行网格搜索 但出现以下错误 estimator fit X train y train fit params TypeError fit takes 2 positional arguments bu
  • ASP>net MVC 可重用部分

    在 winforms 和 ASP net 中使用 net 几年后 我现在开始进入 MVC 我知道有点晚了 对我来说 一个主要的困惑是可重用 组件 的概念 类似于网络表单中用户控件的概念 例如 我希望在我的网站的会员区域内有许多 小部件 其中
  • OpenCL 内置函数“选择”

    我不清楚内置 OpenCL 函数的目的是什么select 有人可以澄清一下吗 来自 OpenCL 规范 功能选择 基因型a 基因型b 基因型c 返回 对于向量类型的每个分量 结果 i 如果设置了 c i 的 MSB b i a i 在这种情
  • 在 asp.net C# 中使用客户端 ID 和客户端密钥访问 Sharepoint 列表

    目前 我可以使用用户 ID 和密码访问共享点列表 如下所示 但想了解如何使用客户端 ID 和客户端密码访问列表 string siteUrl https xyz sharepoint com sites MyList ClientConte
  • VBA 运行时错误 3134

    以下代码创建一个 SQL 字符串 该字符串在 MS Access 中产生语法错误 3134 sql INSERT INTO tblItems desc descExtended itemNumber currentPrice VALUES
  • Spring Security 加密 MD5

    我有一个使用 spring 框架和 spring security 进行登录的 java web 应用程序 在我的数据库中 我的密码在保存之前已加密为 MD5 我在 application config xml 中添加了这段代码
  • jQuery DataTable - 搜索一列下拉列表

    我有一个简单的 jQuery 数据表 其中包含 4 列 其中一列是下拉列表 table tfoot tr th class searchBox Vendor Location th th class searchBox Currency t
  • RestKit valueTransformer 没有被调用

    我正在使用 RestKit 与我的 JSON 端点对话 端点返回一个以 毫秒数 为单位的 UNIX 时间戳 但是 RestKit 的默认转换器假定它是 秒数 并且我在 NSDate 中得到了错误的值 所以我环顾四周 发现我需要使用自定义 v
  • 在同一请求中创建和更新结构时可能出现的竞争条件 - Coldfusion

    大约一年前 我问了一个关于我在应用程序中遇到的错误的问题 该错误表明可能存在竞争条件 在 ColdFusion 中创建结构体时可能存在竞争条件 https stackoverflow com questions 19859690 possi
  • 使用 clang 在命令行上编译多个 Objective-C 文件

    希望是简单的问题 我正在尝试使用 clang 从命令行学习基本的 Objective C 编译 我知道 Xcode 对于复杂的项目来说是一个更好的解决方案 我计划很快转向它 但我个人觉得如果我可以在终端中手动编译一门语言 我会更好地理解它
  • Ember 过渡和渲染完成事件

    是否触发了任何事件 表明转换 渲染已完成 并且 dom 可见 准备就绪 setupcontroller activate 在 dom 构建 渲染之前 仅当我已经插入一个元素并且我只是将其下面的模型切换出来时 didInsertElement
  • 通过 PHP 执行 .sh 脚本

    我有一些游戏服务器 我需要运行 shell 脚本来提高质量 我试图弄清楚如何通过同一服务器上的网页运行这些脚本 这是一个 Ubuntu 专用服务器 网站文件位于 var www 我需要手动运行的 sh 文件位于 home amservers
  • 在 Lambda 中获取用户的 IP 地址(使用 API 网关和 Python)

    我正在使用这种技术 如何使用 Python 检索 AWS Lambda 公共 IP 地址 https stackoverflow com questions 48619163 how could i retrieve aws lambda
  • 使用 Swift 中的新并发将同步函数转换为异步函数

    我想将同步函数转换为异步函数 但我不知道正确的方法是什么 假设我有一个需要很长时间才能获取数据的同步函数 func syncLongTimeFunction throws gt Data Data 然后我在下面的函数中调用它 它仍然是一个同
  • 为什么要更改选项卡,停止 ios 应用程序中的动画?

    我的应用程序中有多个选项卡 我的一个视图控制器正在运行动画 当我切换到另一个视图控制器 并再次进入带有动画的视图控制器时 动画停止 有人可以指导我使用 Xcode 甚至在 Iphone 应用程序中切换选项卡吗 IBAction btn id
  • 根据音色(音调)按相似度对声音进行排序

    解释 我希望能够根据以下内容对列表中的声音集合进行排序音色 音调 的声音 这是一个玩具示例 其中我手动对我创建的 12 个声音文件的声谱图进行了排序 上传到这个仓库 https github com samgermain sort soun
  • 如何在Postman中存储和重用cookie?

    我在用着Postman https www getpostman com 测试和使用 API 对于登录 url API 需要发送 POST 请求username and password作为字段 我这样做 我得到了200回复我已登录的消息
  • Cythonized 函数出乎意料地慢

    我想加快我经常使用的功能 并且我考虑使用 cython 然而 在尝试了我在文档中找到的所有可能的 cython 优化之后 cython 代码比 python numpy 函数慢大约 6 倍 令人失望 这是我的测试代码 forward1是py