python 程序加速

2015 年 1 月 12 日
 zerh925

公司现在在用python做自动化开发,原型已开发完毕,现在就是提速,之前开发的时候完全不考虑时间成本,达到目的优先,现在就是要把2分钟的程序压缩到5秒以内。想请问下大家有哪些可行的手段?我能想到的multiprocess,Cython和SWIG用C来写模块。

5876 次点击
所在节点    Python
35 条回复
zhicheng
2015 年 1 月 12 日
打算靠换个语言或者改几个变量类型就把性能提升 20 多倍不太现实。楼主还是在工程上找解决办法,比如是不是有些流程是不必要的。
sunus
2015 年 1 月 12 日
做调优的第一步是找到时间花在哪里了?
lupino
2015 年 1 月 12 日
异步,并发
henices
2015 年 1 月 12 日
@sunus 说的完全正确。

看看瓶颈在哪里, CPU ? IO ? Memory ?
找到问题之后就可以作出相应的代码调整了。
20015jjw
2015 年 1 月 12 日
Spark?
ihciah
2015 年 1 月 12 日
上GPU?
thankyourtender
2015 年 1 月 12 日
加机器
wdlth
2015 年 1 月 12 日
如果是密集计算,再怎么优化还是看你的电脑的运算速度,像破解密码一样,可以试试通过GPU进行加速,将算法改写支持多线程、并行计算等。
typcn
2015 年 1 月 12 日
改用C语言
alsotang
2015 年 1 月 12 日
说了半天也不详细描述一下场景
R4rvZ6agNVWr56V0
2015 年 1 月 13 日
@alsotang 顶。lz不表述清楚具体场景就求建议,这帮人,不知道具体场景就开始指挥,哎。

我怀疑lz代码有问题。
alsotang
2015 年 1 月 13 日
@GeekGao 我判断楼主应该是遇到了 cpu 方面的瓶颈而不是 io 的,但他还是需要详细描述下
zerh925
2015 年 1 月 13 日
谢谢楼上各位的建议和意见。由于是自动化软件,经过profilling之后发现,memory不是问题,I/O是使用scipy.io读取的mat和读取pickle,mat有差不多5G,读取8秒左右,但是这个步骤只做一次,所以不是问题。现在主要是有一步需要使用levmar函数计算耗费大量的时间,这个函数现在使用的是第三方python库。
目前总结:1.levmar使用原生的c开发的库,然后编译成python可调用的模块。
2. 使用cuda加速图像处理。
3. multiprocessing
4. refactoring
5. 优化业务逻辑
ruoyu0088
2015 年 1 月 15 日
我相信你使用的levmar一定不是纯Python的,它一定是使用的某个C/C++/Fortran语言编写的库。你能说说你使用的是哪个库吗?

levmar算法需要回调函数,这个回调函数你用Python编写,所以唯一能提高速度的就是用编译语言编写这个回调函数。

首先你需要测试瓶颈是否是这个回调函数。如果是的话,你可以用Cython包装C语言的levmar库,然后接收一个编译之后的回调函数。下面是一个例子:

http://nbviewer.ipython.org/github/ruoyu0088/openbooks/blob/master/cython_ctypes_cffi_numba_calls.ipynb

下面是用cython编写的levmar,你可以仿照上面的例子修改这个库,让它能接受编译之后的回调函数。

https://github.com/tkanmae/levmar
zerh925
2015 年 1 月 15 日
@ruoyu0088 万分感谢!非常有用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/161382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX