maritimus 发表于 2021-1-11 11:00

求教Python中写Numpy C扩展比较简单的库

如题,我有个需求是对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优化,对多层循环有奇效

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

maritimus 发表于 2021-1-11 11:26

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



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

patchper 发表于 2021-1-11 12:02

cython更简单,不过你这是要和numpy连用,建议先查查numpy的开发手册。

nexus1 发表于 2021-1-11 12:25

我看数码区学习py的气氛热火朝天啊……

maritimus 发表于 2021-1-11 12:40

patchper 发表于 2021-1-11 12:02
cython更简单,不过你这是要和numpy连用,建议先查查numpy的开发手册。

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

maritimus 发表于 2021-1-11 12:41

nexus1 发表于 2021-1-11 12:25
我看数码区学习py的气氛热火朝天啊……

啊哈哈哈应该感谢Python侠嘛

maritimus 发表于 2021-1-13 16:14

maritimus 发表于 2021-1-11 11:26
啊 这。。。直接跳到jit嘛,我先试试,但是毕竟不是自己写,心里没底啊
...

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

Numba不支持的

dorasir 发表于 2021-1-13 16:39

看到标题我第一反应是python侠居然进化得这么快了

alann 发表于 2021-1-13 17:48

尽量利用广播机制,不要用for循环,就能快很多了,试试看能不能改进代码。

光荣的小学生 发表于 2021-1-13 19:37

相互理解 发表于 2021-1-13 20:57

绝大部分情况下还是转换为矩阵运算效率更高,考虑下 opencv,考虑下卷积

maritimus 发表于 2021-1-13 21:56

考虑了矩阵运算,确实不行。OpenCV我也很熟,之前拿C++写过类似的功能

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

霜落xss 发表于 2021-1-13 22:02

推荐两份资料
http://people.duke.edu/~ccc14/sta-663-2016/18F_Optimization_Bakeoff.html
https://numpy.org/doc/stable/user/c-info.python-as-glue.html

Mocilol 发表于 2021-1-13 23:36

确实推荐numba,如果自己写c随便写然后ffi调用就是了,和luajit的ffi一样

mimighost 发表于 2021-1-14 06:45

先试试Cython

mimighost 发表于 2021-1-14 06:45

不能尝试用np直接把python的for循环的部分去掉么

去掉之后速度肯定就快了
页: [1]
查看完整版本: 求教Python中写Numpy C扩展比较简单的库