Chinaunix

标题: 强调实用主义——采访Python专家HyryStudio [打印本页]

作者: 无风之谷    时间: 2012-05-29 14:36
标题: 强调实用主义——采访Python专家HyryStudio
本期采访嘉宾:张若愚(HyryStudio)

日本神户制钢综合研究所从事研究开发工作,研究方向为:嵌入式DSP信号处理系统开发,嵌入式MCU控制系统开发,工业控制软件开发,信号处理、数据处理以及生产系统的计算机模拟。

欢迎大家跟帖提问,我们对于跟帖提问的网友给予30积分的奖励。更多访谈请关注ChinaUnix访谈录:http://star.chinaunix.net/

ChinaUnix社区:
     张先生您好!很高兴您能够接受ChinaUnix的采访,能够给大家简单地介绍一下?

HyryStudio:
     我2000年到日本留学,2004年硕士毕业之后一直在神户制钢的综合研究所从事研究开发工作。工作内容主要有DSP和MCU的嵌入式开发,工业控 制软件开发,以及一些信号处理、控制方面的内容。在工作中我逐渐使用Python解决各种问题,目前Python已经是我最主要的开发语言。

ChinaUnix社区:
     在好多技术开发人员眼中,Python可能只是一个脚本语言,现在大量的Python框架的流行,让Python有了向企业 级应用架构进军的机会,但是从您的图书的题目中我们能够看到,Python其实也是科学计算中的一个好手,能够简单地介绍一下Pytho科学计算的历史及 现在的应用前景么?

HyryStudio:
      正如 Eric Jones 为《Python科学计算》所作的序中提到的,Python自从诞生以来就一直和科学计算有着十分密切的联系。前期的许多Python研讨会都是在美国的各个研究机构举办的。Python 1.0诞生于1994年,而目前Python科学计算最核心的扩展库 NumPy 的前身Numeric在1995年就已发布。当时网络应用还未发展起来,Python可能更多的是运用于系统管理脚本以及一些计算任务。在2005年左右 NumPy将当时的两个数组处理扩展库Numeric和Numarray进行合并统一,成为Python科学计算最核心的扩展库。在NumPy基础之上, 发展出了很多Python专用的科学计算扩展库,而许多开源函数库也提供了Python的绑定,例如OpenCV、VTK,这些扩展库也通常会使用 NumPy的数组和Python交换数据。
目前Python在科学计算界的应用已经十分广泛。从2008年开始每年都举办了Python科学计算方面的会议,从中我们可以看到Python在各个领域的运用。而在今年的 PyCon2012 中,科学计算方面的内容更是占据了相当大的部分。
      实际上许多工程师、科学家并非专职的程序员,他们需要一种简单易学、功能强大而且免费开源的开发环境帮助他们解决工作中遇到的实际问题。 Python以及其众多的扩展库就构成了这样一个生态环境。他们可以编写简单的脚本做一些快速的数据处理,或者编写功能完整的计算、仿真应用程序,还可以 将现有的C、Fortran函数库包装成Python的扩展库。每位技术人员都能从Python的生态环境受益。

ChinaUnix社区:        

      其实我们也能够看到,开源软件在科学等领域有很深远的影响,比如在科学计算、生物信息学等方面,都有非常有名的开源软件,能够简单地和我们介绍一些在科学计算方面Python社区有哪些比较有名的项目或者函数库么?

HyryStudio:
      Python一直保持着很强的实用主义,它通常不会去试着重新开发一整套函数库,而是将现有的开源函数库包装成其扩展库。而Python则通过这些扩展库将众多的开源函数库连接在一起,是名符其实的胶水语言。例如由华盛顿大学的教授主导开发的 Sage ,就是一套以代替MATLAB、Mathematica、Maple等商用科学计算软件为目的的开源系统。它通过Python结合了众多的开源科学计算软件,并通过网页浏览器提供了一个与其交互的记事本文档界面。
Python的科学计算扩展库非常多,不同专业的技术人员都可以找到适合自己的扩展库。下面是我经常会用到的一个非常不完全的列表:
•        NumPy + SciPy + matplotlib + IPython : 这几个应该是每位开发者都应具备的扩展库。NumPy提供了多维数组以及众多的处理函数,SciPy提供了各种数值运算功能,matplotlib能绘制 出精美的二维图表,IPython则提供了一个超强的命令行,最新版的IPython还添加于Sage类似的浏览器的记事本界面(notebook)。
•        SciKits : 其中包括许多独立的扩展库,作为SciPy的补充。其中 scikit-learn 是一套机器学习库,包含了比较完善的文档以及众多的实例程序。
•        Pandas : 以Python世界中 R 的替代品为目标的数据分析库。根据其官方网站的测试,Pandas在许多方面的性能都比R要高。
•        ETS : 这是一套Enthought公司开发的函数库,其中的 Mayavi 能很方便地对数据进行三维可视化。
•        OpenCV : 这是一套计算机视觉库,目前的最新版本已经提供了十分完备的Python接口,能够调用OpenCV中众多的图像处理、模式识别函数直接对NumPy数组进行处理。

ChinaUnix社区:
      因为科学计算的特殊性,能够简单介绍一下Python在这个领域有哪些优势以及应用的场景,这个语言本身将来会有哪些进步呢?

HyryStudio:
      大多数工程师、科学家使用科学计算软件的目的都是为了快速解决其工作中遇到的问题,而不是开发出一套完整的软件。这就是为什么MATLAB这样的商 用科学计算软件十分流行的原因。而Python在这一点上实际上和MATLAB十分相似,我们也可以使用Python众多的扩展库快速写出一次性的数据处 理、运算的脚本。然而由于Python语言的一些高级特性,以及众多的科学计算之外的扩展库,我们可以将积累下来的一次性脚本进行改造,为它们提供命令行、GUI、 数据库、网络等众多接口,最终成为一套完整的工具包或者实用的计算软件。而且由于是开源的自由软件,我们可以在任何系统中安装Python环境,运行我们 的程序。我工作中所接触的所有计算机以及家中的电脑中都安装了Python环境,随时有了一个想法都可以立即打开电脑实现试试看,这对于需要授权的商用软 件来说是无法想象的。
      目前Python正处在2.x版本和3.x版本并存的时代,3.x将2.x中一些不合理、过时的设计剔除掉,为将来更好的发展打下良好的基础。然而 3.x并不兼容2.x,因此许多扩展库需要进行不小的改动。Python社区目前的当务之急是将众多的扩展库迁移到3.x版本之上。在科学 计算领域,NumPy已经移植成功。这为其它依赖于NumPy的扩展库铺设了一条光明之路。
一直以来,开发者们对Python的执行效率颇有微词,因此Python科学计算方面的社区在未来或许会更致力于运行效率方面。目前较为实际的解决方案是用编译型语言编写核心计算函数,然后对其进行包装,让Python调用。而 Cython 则可以将Python程序转换成C语言程序,并且可以通过一些特殊的编译型语言的语法,将程序的运行速度提升到C语言级别。此外另起炉灶的 PyPy 则通过JIT编译,提高Python程序的运行速度。根据目前的测试,平均能提速5倍,而对于纯数值的运算提升数十倍也是可能的。现在PyPy社区正致力于NumPy的移植工作,一旦移植成功,Python科学计算就又多了一种选择。

ChinaUnix社区:
      能够谈谈目前的工作么,国内外的科研院所的工作氛围相比,有何区别?以及大家对开源软件的看法和对软件版权的态度和意思。

HyryStudio:
      我的工作内容比较繁杂,但是大多数都会使用到Python,我曾写过一篇博文专门介绍 Python如何帮助我高效完成工作 。
我不了解国内的研究所的情况,而日本的研究所也就仅能就我所知做一些介绍。首先日本的许多专门从事软件开发的公司都比较保守,很多新开发的系统仍然 会使用10多年前的开发工具,例如VB 6.0、VC 6.0。一些大公司的商用项目还会使用.net 2.0或是Java 1.4这样N年前的平台。
      我所在的研究室并非专门从事软件开发,专门写程序的只有我一个人。同事们通常会使用Excel做数据处理,一些较复杂的东西会用MATLAB做。但 是由于MATLAB十分昂贵,因此整个20多人的研究室只有2台电脑安装了MATLAB,作为MATLAB专用机器,在日本的公司里是绝对不能用未授权的 软件的。
      如上所述,这种环境很不适合研究开发工作。这样他们也会自己寻找一些开源软件作为替代,例如 Scilab 。我所在的研究所的工作环境在日本来说还是比较宽松的,能够比较自由地选择软件。我在5年前左右开始大量使用Python进行开发,并且取得了很好的效 果。经过这些年的积累,同事们也对Python的能力有所了解了。最近我们已经开始定期举行Python学习会,在研究室内部推广Python的使用。因 此一款开源软件要获得大家的认可需要较长的周期和一些实际的成果。

ChinaUnix社区:
      国内相关的开源相关的科学技术的图书也不是很多,能够谈谈原因么?

HyryStudio:
     国内科学计算软件方面的书籍大都是介绍MATLAB的(其实日本也差不多)。这一方面和我国的软件版权环境有关,另一方面MATLAB这样的商用软 件更加会做市场推广工作,例如为大学提供廉价的MATLAB,以及十分详尽的文档。而开源软件的开发者多半将精力放在软件开发上,因此入门文档、手册以及 市场推广方面都与商用软件有较大的差距。这就需要我们这些开源软件的受益者多做宣传和推广工作。只要能做到文档丰富、对初学者友好,我想开源软件会更加有 市场的。


作者: lkk_super    时间: 2012-05-29 14:43
在使用这些科学计算的模块的时候,是否有对这些模块进行一些定制开发等工作呢?如果有的话,有什么比较印象深刻的经历值得分享的呢?
作者: chenyx    时间: 2012-05-29 15:01
板凳支持
作者: to407    时间: 2012-05-29 15:20
地板 字数不够。
作者: king_819    时间: 2012-05-29 16:19
支持,希望以后多分享
作者: DiDeCrouse    时间: 2012-05-29 17:34
python语言很不错。现在使用越来越广了
作者: HyryStudio    时间: 2012-05-29 18:40
lkk_super 发表于 2012-05-29 14:43
在使用这些科学计算的模块的时候,是否有对这些模块进行一些定制开发等工作呢?如果有的话,有什么比较印象 ...


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

然后就是做界面时,有时候会将matplotlib的图表以及Mayavi的三维场景嵌入到PyQt的界面、或者TraitsUI制作的界面中。一般做界面程序的时候我都会嵌入一个Python命令行,这样有时候出现问题时,可以通过这个命令行查看各个对象的属性,以及调用它们的方法。
作者: ecjtubaowp    时间: 2012-05-29 21:52
听说Fortran做科学计算很强大,没接触过。也很想学学python
作者: Gray1982    时间: 2012-05-29 22:49
to407 发表于 2012-05-29 15:20
地板 字数不够。



哈哈哈哈
学Python也有几年了,相当实用
作者: lemoncandy    时间: 2012-05-30 09:07
HyryStudio 发表于 2012-05-29 18:40
工作中以解决问题为第一原则,因此如果某个库中找不到合适的函数,就会找找其它的库,基本上不需要做什 ...


以前一直以为python就是和perl、php差不多的东西

原来还干了很多matlable能够干的事情啊
作者: 追忆的风筝    时间: 2012-05-30 09:21
记得在大学做科学计算,数据或信号处理,用的是MATLAB,早知道Python科学计算这么强大,当初就该建议老师使用Python

有个问题想请教下:
Python的运行效率,一直让我比较头疼,利用一些扩展库能够解决数据计算的速度上,但是有些时候速度慢不是因为数据计算,有没有好的优化方法,或谈下经验?
作者: lkk_super    时间: 2012-05-30 09:58
回复 7# HyryStudio


    一般做界面程序的时候我都会嵌入一个Python命令行  
   这个方法不错 学习了 谢谢分享~~~
作者: Moon_Bird    时间: 2012-05-30 14:06
很邪恶的歪一下楼:
论快感,C++/C是看黃書,Python是擼管,Ruby就是拉著個妹子肆意蹂躪 {:3_189:} {:3_189:}
作者: 追忆的风筝    时间: 2012-05-30 14:21
如何用C扩展Python?
作者: 木头小飞    时间: 2012-05-30 14:26
我前天刚开始看python
作者: Hongqiyaodao    时间: 2012-05-30 14:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: HyryStudio    时间: 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这一步就够用了。
作者: pitonas    时间: 2012-05-30 19:30
这个语言本身将来会有哪些进步呢?
作者: crazyhadoop    时间: 2012-05-30 22:13
那本书写的真心赞,是做研究的好帮手!有了Python,工具无忧啊
作者: Shell_HAT    时间: 2012-05-31 00:25
目前还停留在把Python当脚本用的初级阶段,向专家学习了。
作者: 小把戏    时间: 2012-05-31 01:13
最后一句说的太好了。 其实应该把文旦等这些都认真的做,相信发展的会更好。
作者: 追忆的风筝    时间: 2012-05-31 08:48
回复 17# HyryStudio

我曾经工作共有个需求,是将一个服务器接收的数据包转发到另外一台服务器,1秒钟有几个百个并发请求,就会发现Python有很大的瓶颈,速度好慢,我已经使用了multiprocess、stackless等方式,包括用堆栈,进行异步处理,把数据都放到了内存中(用的字典),但还是因为性能问题放弃了这种方式。

除此之外,能多谈谈Cython的实现吗?
   
作者: crazyhadoop    时间: 2012-05-31 13:04
回复 11# 追忆的风筝


    python 的优势在于轻便和灵活,速度确实不如matlab,这一点上python还是稍逊一筹的。 优化竟可能还是提高程序本身的实现技巧吧。能不重复计算的就不要重复计算,能多机并行的,就不要在一个机器上死磕
作者: 追忆的风筝    时间: 2012-05-31 13:52
回复 23# crazyhadoop

并行计算是一个思路,将数据流分布到不同的服务器上,将结果进行汇总。但数据处理方式很多,但有些时候瓶颈不在这。Python实现分布式计算,可以分享下经验吗?
   
作者: crazyhadoop    时间: 2012-05-31 14:10
回复 24# 追忆的风筝


    如果有大量的运算数据要做,我会把这些数据按照使用的顺序划分一下,比如在文本分类计算的时候,首先处理原始数据,每200M分出一个文件,然后训练程序就开始去读取这些文件。慢慢的就会有 10个左右的进程在同时处理这些文件。然后再汇总结果,基本就是这样吧。那么多核不要浪费。


作者: 追忆的风筝    时间: 2012-05-31 16:55
在工作中有些情况是,在并发请求大的时候,就算用Python把请求的数据往内存里放,都放不进去。先不说数据处理用多长时间,至少不能丢数据啊,实在是郁闷。
作者: HyryStudio    时间: 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中往列表中添加对象的函数,可以节省不少运行时间。
作者: HyryStudio    时间: 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倍。
作者: HyryStudio    时间: 2012-05-31 18:56
回复 18# pitonas

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

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

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

http://pyvideo.org/video/956/keynote-guido-van-rossum
作者: 追忆的风筝    时间: 2012-06-01 08:26
回复 27# HyryStudio

感谢回答!
   
作者: 追忆的风筝    时间: 2012-06-01 08:49
我对于python用matplotlib不是很了解,想请教下,我有一些数据,如下:
  1. 2012-04-01_02        68
  2. 2012-04-01_05        70
  3. 2012-04-01_08        69
  4. 2012-04-01_11        71
  5. 2012-04-01_14        72
  6. 2012-04-01_20        70
  7. 2012-04-02_02        71
  8. 2012-04-02_05        70
  9. 2012-04-02_08        69
  10. 2012-04-02_11        71
  11. 2012-04-02_14        69
  12. 2012-04-02_20        71
  13. 2012-04-03_02        74
  14. 2012-04-03_05        73
  15. 2012-04-03_08        77
  16. 2012-04-03_11        70
  17. 2012-04-03_14        71
  18. 2012-04-03_20        70
  19. 2012-04-04_02        70
  20. 2012-04-04_05        72
  21. 2012-04-04_08        72
  22. 2012-04-04_11        69
  23. 2012-04-04_14        71
  24. 2012-04-04_20        69
  25. 2012-04-05_02        75
复制代码
根据时间和数值,想画个图,以前都是用Excel实现,Python用Pychart也可以实现,既然是科学计算matplotlib应该也有实现的方式吧?

作者: txdgtwpv    时间: 2012-06-01 09:45
python是用来解决问题的语言
作者: HyryStudio    时间: 2012-06-01 18:53
回复 31# 追忆的风筝

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

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




作者: isaacxu    时间: 2012-06-01 19:50
本帖最后由 isaacxu 于 2012-06-02 00:21 编辑

科学计算还是建议使用Fortran,60年的发展排除了许多缺陷,编译器经过不断的优化比较可靠。


作者: 追忆的风筝    时间: 2012-06-02 10:42
回复 34# HyryStudio

感谢回答,我现在工作中的各种需求都基本上用Python解决,以后多多研究科学计算方面的技术。
   
作者: sunny7476    时间: 2012-06-02 10:48
感觉人们对Python做科学计算还有一点点怀疑,毕竟Matlab影响太大了。而且与文章中“保守”的思想也有点关系。同时,如果Python基金会能支持一个“官方”的科学计算组件包就好了。同时Python(x, y)也很不错了。还是那句话,支持PyPy。
作者: wangzwang_cu    时间: 2012-06-03 17:47
请教各位,Python在桌面应用和UI方面有什么特长呢,有没有比较印象深刻的经历值得分享的呢?
作者: HyryStudio    时间: 2012-06-04 19:19
回复 38# wangzwang_cu

简单的界面我用TraitsUI,复杂的界面就用PyQt或者PySide,嵌入Mayavi, matplotlib或者QwtGUI都很方便。印象比较深刻的一次是用gevent的协程在GUI单线程中实现比较复杂的逻辑。
   
作者: 追忆的风筝    时间: 2012-06-05 09:40
如果不使用pythonxy集成的python软件包,安装SciPy和Pylab之类的还挺费劲!
作者: hztj2005    时间: 2019-06-21 15:50
因为对《Python科学计算》感兴趣,搜到这个网页。赞一个!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2