推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
zerh925
V2EX  ›  Python

python 程序加速

  •  
  •   zerh925 · Jan 12, 2015 · 6328 views
    This topic created in 4314 days ago, the information mentioned may be changed or developed.

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

    Supplement 1  ·  Jan 13, 2015
    谢谢楼上各位的建议和意见。由于是自动化软件,经过profilling之后发现,memory不是问题,I/O是使用scipy.io读取的mat和读取pickle,mat有差不多5G,读取8秒左右,但是这个步骤只做一次,所以不是问题。现在主要是有一步需要使用levmar函数计算耗费大量的时间,这个函数现在使用的是第三方python库。
    目前总结:1.levmar使用原生的c开发的库,然后编译成python可调用的模块。
    2. 使用cuda加速图像处理。
    3. multiprocessing
    4. refactoring
    5. 优化业务逻辑
    35 replies  •  2015-01-15 17:11:19 +08:00
    loading
    loading
    Jan 12, 2015 via Android
    1
    用go重构。
    geeklian
    geeklian
    Jan 12, 2015 via iPhone
    2
    2分钟压缩到5秒...
    虽然大家都知道python比C慢,但还没到这地步吧。
    cevincheung
    cevincheung
    Jan 12, 2015
    3
    为什么我想说“多机并行计算”呢……
    min
    min
    Jan 12, 2015
    4
    优化的第一步永远是先profiling
    yakczh
    yakczh
    Jan 12, 2015
    5
    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
    zerh925
    zerh925
    OP
    Jan 12, 2015
    6
    @geeklian 因为程序中间最耗时间的部分可以并行的
    zerh925
    zerh925
    OP
    Jan 12, 2015
    7
    @yakczh 谢谢 我去google一下
    zerh925
    zerh925
    OP
    Jan 12, 2015
    8
    thx. will do.
    zerh925
    zerh925
    OP
    Jan 12, 2015
    9
    @loading 不是很明白 改用go语言吗?为什么
    shiny
    shiny
    PRO
    Jan 12, 2015
    10
    先分析瓶颈
    messense
    messense
    Jan 12, 2015
    11
    性能瓶颈如果是 CPU 计算密集型的试试 multiprocessing,network IO 密集型的多线程也能有一定程度的提升。
    zerh925
    zerh925
    OP
    Jan 12, 2015
    12
    @messense 非常感谢。正是计算密集型的。
    tabris17
    tabris17
    Jan 12, 2015
    13
    想要速度当初就不要选python吗,试试pypy,不行就拉倒吧
    zerh925
    zerh925
    OP
    Jan 12, 2015
    14
    @tabris17 老板是偏执狂。
    skybr
    skybr
    Jan 12, 2015❤️1
    15
    Cython就可以了。

    把几个数值类型的PyObject声明成C类型的, 套在with nogil里。

    外面用线程池就好了。
    skybr
    skybr
    Jan 12, 2015❤️1
    16
    涉及到动态链接库, 比如标准库的IO和一些C扩展, PyPy可能反而比CPython慢。
    dreampuf
    dreampuf
    Jan 12, 2015❤️1
    17
    两个思路都是对的,并行利用多核以及用更快的底层。

    并行方面看看是IO还是CPU,IO的话用gevent试试,耗时不大,CPU的话有一些计算框架,但都需要时间去采坑,而且不一定都合适。用原始的multiprocess的话,主要问题是数据交互方面非常原始,得
    踩很多坑。
    更换底层可以试试Cython,在不调用其他类库的纯计算可以做到两个量级的优化。或者用PyPy,Pyston。

    Python平台资源丰富,没有什么过不去的坎,动不动嚷嚷换一门语言,似乎是那门语言小白特有的情怀。
    clino
    clino
    Jan 12, 2015❤️1
    18
    建议用 cython 试试
    zerh925
    zerh925
    OP
    Jan 12, 2015
    19
    @dreampuf 感谢
    zerh925
    zerh925
    OP
    Jan 12, 2015
    20
    @skybr 谢谢建议
    zhicheng
    zhicheng
    Jan 12, 2015
    21
    打算靠换个语言或者改几个变量类型就把性能提升 20 多倍不太现实。楼主还是在工程上找解决办法,比如是不是有些流程是不必要的。
    sunus
    sunus
    Jan 12, 2015❤️1
    22
    做调优的第一步是找到时间花在哪里了?
    lupino
    lupino
    Jan 12, 2015
    23
    异步,并发
    henices
    henices
    Jan 12, 2015
    24
    @sunus 说的完全正确。

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

    我怀疑lz代码有问题。
    alsotang
    alsotang
    Jan 13, 2015
    32
    @GeekGao 我判断楼主应该是遇到了 cpu 方面的瓶颈而不是 io 的,但他还是需要详细描述下
    zerh925
    zerh925
    OP
    Jan 13, 2015
    33
    谢谢楼上各位的建议和意见。由于是自动化软件,经过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
    ruoyu0088
    Jan 15, 2015❤️1
    34
    我相信你使用的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
    zerh925
    OP
    Jan 15, 2015
    35
    @ruoyu0088 万分感谢!非常有用。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2813 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 13:48 · PVG 21:48 · LAX 05:48 · JFK 08:48
    ♥ Do have faith in what you're doing.