免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

强调实用主义——采访Python专家HyryStudio [复制链接]

论坛徽章:
0
1 [报告]
发表于 2012-05-29 18:40 |显示全部楼层
lkk_super 发表于 2012-05-29 14:43
在使用这些科学计算的模块的时候,是否有对这些模块进行一些定制开发等工作呢?如果有的话,有什么比较印象 ...


工作中以解决问题为第一原则,因此如果某个库中找不到合适的函数,就会找找其它的库,基本上不需要做什么定制工作。只是偶尔找不到合适的数组处理函数时,会用Cython编写,其结果和直接用C语言写效率差不多,很方便。

然后就是做界面时,有时候会将matplotlib的图表以及Mayavi的三维场景嵌入到PyQt的界面、或者TraitsUI制作的界面中。一般做界面程序的时候我都会嵌入一个Python命令行,这样有时候出现问题时,可以通过这个命令行查看各个对象的属性,以及调用它们的方法。

论坛徽章:
0
2 [报告]
发表于 2012-05-30 18:48 |显示全部楼层
追忆的风筝 发表于 2012-05-30 09:21
记得在大学做科学计算,数据或信号处理,用的是MATLAB,早知道Python科学计算这么强大,当初就该建议老师使 ...


你能具体说说是些什么情况吗?

因为我主要编写计算、数据处理方面的程序。我一般程序优化分为如下几个步骤:

1. 找合适的扩展库。
2. 找不到扩展库时,先用Python实现。
3. 如果Python实现速度不够用,那么就用Cython。
4. Cython还不够用时就找有没有C语言的库,然后尝试用Cython或者SWIG等进行包装。
5. 如果还不够用就考虑多进程,若能将计算分为多进程那是最好,至少可以将计算和GUI进程分开。

对于我遇到的绝大多数情况,通常到Cython这一步就够用了。

论坛徽章:
0
3 [报告]
发表于 2012-05-31 18:39 |显示全部楼层
追忆的风筝 发表于 2012-05-31 08:48
回复 17# HyryStudio

我曾经工作共有个需求,是将一个服务器接收的数据包转发到另外一台服务器,1秒钟有 ...


网络并发的话,瓶颈应该不在CPU处理之上,而是在网络处理吧。我对这个不熟悉,不过就我多年在Python社区潜水的经验,似乎gevent之类的异步处理库应该能实现高并发吧。如果瓶颈在CPU对数据包的处理的话,那就可以用Cython之类的加速了。

Cython将Python程序翻译成调用Python API的C语言程序,然后进行编译。如果是针对纯Python程序的话,翻译成C语言可以节省Python虚拟机中的那个解释用的大循环,运行速度能够提高30%左右。

如果使用Cython的静态语言关键字对程序中一些变量进行类型定义的话,Cython就可以将程序翻译成更加优化的C语言程序,从而大幅度提高运行速度。例如下面的程序:

a = []
a.append(1)

如果Cython不知道a是列表,它就会调用Python API首先向对象a请求append方法对象,然后再通过Python的函数调用运行append方法。

但是如果:

list a = []
a.append(1)

那么Cython知道a是一个列表,于是它直接调用Python API中往列表中添加对象的函数,可以节省不少运行时间。

论坛徽章:
0
4 [报告]
发表于 2012-05-31 18:41 |显示全部楼层
本帖最后由 HyryStudio 于 2012-05-31 18:43 编辑

回复 23# crazyhadoop


其实MATLAB也只是针对一些矢量运算调用底层Fortran库时速度很快,这部分和Python调用的库是差不多的,所以MATLAB在这方面和NumPy,SciPy是一个级别的。

至于程序内部的循环判断等语句的执行速度,据说最近的MATLAB有JIT,可以大幅度提高程序的运算速度,不过我很久没有用过MATLAB了,不太清楚。

最近有一个新的语言Juila,它提供了一个简单的运算速度比较:

http://julialang.org/

从那个比较的表格可以看出:
  1. def fib(n):
  2.    if n<2:
  3.        return n
  4.    return fib(n-1)+fib(n-2)

  5. 运行速度比较
  6. Python 31.47
  7. matlab 1336.37
  8. Javascript(V8) 1.55
复制代码
fib这样的递归调用函数Python比MATLAB快40倍,很有可能MATLAB不能对大量的函数调用进行JIT优化,因此非JIT优化的MATLAB代码可能比Python慢。而Javascript的V8引擎能进行JIT,因此又比Python快20倍。
  1. def pisum():
  2.    sum = 0.0
  3.    for j in xrange(1, 500):
  4.        sum = 0.0
  5.        for k in xrange(1, 10000):
  6.            sum += 1.0/(k*k)
  7.    return sum

  8. 运行速度比较
  9. Python  18.03
  10. matlab  1.08
  11. Javascript(V8) 0.75
复制代码
对于pi_sum这样的简单的循环判断程序,MATLAB可能做了JIT,因此比Python快18倍,而MATLAB的JIT略逊于Javascript(V

但是我用Cython将pisum重新写了一下:
  1. def pisum2():
  2.    cdef double sum
  3.    cdef int j, k
  4.    sum = 0.0
  5.    for j in range(1, 500):
  6.        sum = 0.0
  7.        for k in range(1, 10000):
  8.            sum += 1.0/(k*k)
  9.    return sum
复制代码
它的运算速度提高了30倍。

论坛徽章:
0
5 [报告]
发表于 2012-05-31 18:56 |显示全部楼层
回复 18# pitonas

我个人觉得将来的发展也不太好预测,不过我个人觉得

1. 首先是将众多的扩展库移植到Python3

2. 提速,Guido在下面的视频中提到,如果有将来办法让Python做一些静态的分析,例如添加一些静态的声明,也许可以提高程序的运行速度。

http://pyvideo.org/video/956/keynote-guido-van-rossum

论坛徽章:
0
6 [报告]
发表于 2012-06-01 18:53 |显示全部楼层
回复 31# 追忆的风筝

我写了一个例子,放到我的网站上了。由于你的数据中时间不是等间隔的,因此用EXCEL绘制的那个图是不准确的。

http://hyry.dip.jp/tech/code/code.html/10



论坛徽章:
0
7 [报告]
发表于 2012-06-04 19:19 |显示全部楼层
回复 38# wangzwang_cu

简单的界面我用TraitsUI,复杂的界面就用PyQt或者PySide,嵌入Mayavi, matplotlib或者QwtGUI都很方便。印象比较深刻的一次是用gevent的协程在GUI单线程中实现比较复杂的逻辑。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP