公司现在在用python做自动化开发,原型已开发完毕,现在就是提速,之前开发的时候完全不考虑时间成本,达到目的优先,现在就是要把2分钟的程序压缩到5秒以内。想请问下大家有哪些可行的手段?我能想到的multiprocess,Cython和SWIG用C来写模块。
1
loading 2015 年 1 月 12 日 via Android
用go重构。
|
2
geeklian 2015 年 1 月 12 日 via iPhone
2分钟压缩到5秒...
虽然大家都知道python比C慢,但还没到这地步吧。 |
3
cevincheung 2015 年 1 月 12 日
为什么我想说“多机并行计算”呢……
|
4
min 2015 年 1 月 12 日
优化的第一步永远是先profiling
|
5
yakczh 2015 年 1 月 12 日
pypy
Python 2.7.3 (f66246c46ca30b26a5c73e4cc95dd6235c966b8f, Jul 30 2013, 09:27:06) [PyPy 2.0.2 with GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 |
8
zerh925 OP thx. will do.
|
10
shiny PRO 先分析瓶颈
|
11
messense 2015 年 1 月 12 日
性能瓶颈如果是 CPU 计算密集型的试试 multiprocessing,network IO 密集型的多线程也能有一定程度的提升。
|
13
tabris17 2015 年 1 月 12 日
想要速度当初就不要选python吗,试试pypy,不行就拉倒吧
|
15
skybr 2015 年 1 月 12 日 Cython就可以了。
把几个数值类型的PyObject声明成C类型的, 套在with nogil里。 外面用线程池就好了。 |
16
skybr 2015 年 1 月 12 日 涉及到动态链接库, 比如标准库的IO和一些C扩展, PyPy可能反而比CPython慢。
|
17
dreampuf 2015 年 1 月 12 日 两个思路都是对的,并行利用多核以及用更快的底层。
并行方面看看是IO还是CPU,IO的话用gevent试试,耗时不大,CPU的话有一些计算框架,但都需要时间去采坑,而且不一定都合适。用原始的multiprocess的话,主要问题是数据交互方面非常原始,得 踩很多坑。 更换底层可以试试Cython,在不调用其他类库的纯计算可以做到两个量级的优化。或者用PyPy,Pyston。 Python平台资源丰富,没有什么过不去的坎,动不动嚷嚷换一门语言,似乎是那门语言小白特有的情怀。 |
18
clino 2015 年 1 月 12 日 建议用 cython 试试
|
21
zhicheng 2015 年 1 月 12 日
打算靠换个语言或者改几个变量类型就把性能提升 20 多倍不太现实。楼主还是在工程上找解决办法,比如是不是有些流程是不必要的。
|
22
sunus 2015 年 1 月 12 日 做调优的第一步是找到时间花在哪里了?
|
23
lupino 2015 年 1 月 12 日
异步,并发
|
25
20015jjw 2015 年 1 月 12 日
Spark?
|
26
ihciah 2015 年 1 月 12 日
上GPU?
|
27
thankyourtender 2015 年 1 月 12 日
加机器
|
28
wdlth 2015 年 1 月 12 日
如果是密集计算,再怎么优化还是看你的电脑的运算速度,像破解密码一样,可以试试通过GPU进行加速,将算法改写支持多线程、并行计算等。
|
29
typcn 2015 年 1 月 12 日
改用C语言
|
30
alsotang 2015 年 1 月 12 日
说了半天也不详细描述一下场景
|
31
R4rvZ6agNVWr56V0 2015 年 1 月 13 日
|
33
zerh925 OP 谢谢楼上各位的建议和意见。由于是自动化软件,经过profilling之后发现,memory不是问题,I/O是使用scipy.io读取的mat和读取pickle,mat有差不多5G,读取8秒左右,但是这个步骤只做一次,所以不是问题。现在主要是有一步需要使用levmar函数计算耗费大量的时间,这个函数现在使用的是第三方python库。
目前总结:1.levmar使用原生的c开发的库,然后编译成python可调用的模块。 2. 使用cuda加速图像处理。 3. multiprocessing 4. refactoring 5. 优化业务逻辑 |
34
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 |