找回密码
 立即注册
搜索
查看: 1816|回复: 16

[软件] 求教Python中写Numpy C扩展比较简单的库

[复制链接]
     
发表于 2021-1-11 11:00 | 显示全部楼层 |阅读模式
如题,我有个需求是对Numpy二维矩阵逐像素做一些处理,目前是在python中遍历的,但是比较慢,打算写个C/C++扩展来做这件事情。稍微查了一下,似乎python的C扩展有好几个库,包括Cython,cffi,ctypes等。我对C和Python都算比较熟,C++会一点。想请教一下坛友,考虑接口简单和可调试性强,应该用哪个库比较合适,访问Numpy的数据结构比较简单。还有就是我目前是在windows下开发,numpy直接用的pip,这种情况是不是还需要装numpy的头文件,会不会linux下处理比较简单。
回复

使用道具 举报

     
发表于 2021-1-11 11:11 | 显示全部楼层
建议先试试numba
零成本的jit优化,对多层循环有奇效

,搂草打兔子,万一成了就不亏
回复

使用道具 举报

     
 楼主| 发表于 2021-1-11 11:26 | 显示全部楼层
手撕寿司 发表于 2021-1-11 11:11
建议先试试numba
零成本的jit优化,对多层循环有奇效

啊 这。。。直接跳到jit嘛,我先试试,但是毕竟不是自己写,心里没底啊
回复

使用道具 举报

     
发表于 2021-1-11 12:02 来自手机 | 显示全部楼层
cython更简单,不过你这是要和numpy连用,建议先查查numpy的开发手册。
回复

使用道具 举报

     
发表于 2021-1-11 12:25 来自手机 | 显示全部楼层
我看数码区学习py的气氛热火朝天啊……
回复

使用道具 举报

     
 楼主| 发表于 2021-1-11 12:40 | 显示全部楼层
patchper 发表于 2021-1-11 12:02
cython更简单,不过你这是要和numpy连用,建议先查查numpy的开发手册。

嗯嗯,就是担心访问numpy这方面。cython在windows下似乎必须msvc编译器,不知道numpy会不会有C库版本之类的问题
回复

使用道具 举报

     
 楼主| 发表于 2021-1-11 12:41 | 显示全部楼层
nexus1 发表于 2021-1-11 12:25
我看数码区学习py的气氛热火朝天啊……

啊哈哈哈应该感谢Python侠嘛
回复

使用道具 举报

     
 楼主| 发表于 2021-1-13 16:14 | 显示全部楼层
maritimus 发表于 2021-1-11 11:26
啊 这。。。直接跳到jit嘛,我先试试,但是毕竟不是自己写,心里没底啊
...

实测了一把 numba不支持的numpy函数有点太多,就算是支持的似乎也有些坑,不是很实用

Numba不支持的
回复

使用道具 举报

发表于 2021-1-13 16:39 | 显示全部楼层
看到标题我第一反应是python侠居然进化得这么快了
回复

使用道具 举报

     
发表于 2021-1-13 17:48 来自手机 | 显示全部楼层
尽量利用广播机制,不要用for循环,就能快很多了,试试看能不能改进代码。
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-1-13 19:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2021-1-13 20:57 | 显示全部楼层
绝大部分情况下还是转换为矩阵运算效率更高,考虑下 opencv,考虑下卷积
回复

使用道具 举报

     
 楼主| 发表于 2021-1-13 21:56 | 显示全部楼层
考虑了矩阵运算,确实不行。OpenCV我也很熟,之前拿C++写过类似的功能

最后还是用的cffi,更自由一点
回复

使用道具 举报

     
发表于 2021-1-13 22:02 | 显示全部楼层
回复

使用道具 举报

发表于 2021-1-13 23:36 | 显示全部楼层
确实推荐numba,如果自己写c随便写然后ffi调用就是了,和luajit的ffi一样
回复

使用道具 举报

发表于 2021-1-14 06:45 | 显示全部楼层
先试试Cython
回复

使用道具 举报

发表于 2021-1-14 06:45 | 显示全部楼层
不能尝试用np直接把python的for循环的部分去掉么

去掉之后速度肯定就快了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-14 06:31 , Processed in 0.102130 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表