python 程序加速

2015-01-12 13:46:53 +08:00
 zerh925

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

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

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

我怀疑lz代码有问题。
alsotang
2015-01-13 11:52:34 +08:00
@GeekGao 我判断楼主应该是遇到了 cpu 方面的瓶颈而不是 io 的,但他还是需要详细描述下
zerh925
2015-01-13 14:22:55 +08:00
谢谢楼上各位的建议和意见。由于是自动化软件,经过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-01-15 16:13:14 +08:00
我相信你使用的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-01-15 17:11:19 +08:00
@ruoyu0088 万分感谢!非常有用。

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

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

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

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

© 2021 V2EX