异步编程和 twisted 系列教程

学习twisted困难的地方就是对异步编程的理解而不是怎样去用twisted 的函数去写代码. twisted 的代码写 ...

↑我也要推荐

用 Python 写高效科学计算程序设计

发布时间:2011-06-15 05:29:39, 关注:+11558, 赞美:+17, 不爽:+4

本文标签: 科学计算 swig numpy matplotlib matlab pyqt wxpython

原始出处: alwin的个人博客

1、科学计算中的突出问题及需求

概括一般科学计算的特点,主要包括四方面:

  • 数值计算种类多

对于某个问题的求解,可能需要不同种类的函数,如三角函数,积分函数,概率统计函数以及某些特殊函数。

需要大量数值计算库支持。

  • 计算密集型问题突出

在大量复杂问题,需要的时间可能指数增长,时间密集性任务往往使程序运行效率低下。计算任务的时间瓶颈必须特殊处理。

  • 数据图形化

数据结果的图形化,有利于结论的表现,是实验分析的重要手段。

  • UI设计需求

程序功能稳定后,需求友好的UI设计,从而提高程序的可用性及普及度。

一般科学计算程序设计很难兼顾以上四部分,大多是独立完成。如调用数据计算库可能会用到GNU Scientific Library;为了并行化处理问题,可能要特别地求助MPI或openMP实现;数据的视图化可能要另外通过Matlab或mathematica操作来实现;对于UI的设计,使用Labview这样的专用工具但又对其他方面的调用显得很不方便。如果能兼顾以上四方面的需求,做到程序设计中的数据流传递平滑过渡,函数无缝调用,那么程序设计的效率将大大提高,因为消除了很多耗时的人工操作,低效率的接口调用,程序的整体显得统一高效。以python语言为中心的程序设计很容易达到这个目的,而传统的Fortran语言望尘莫及。

2、以python为中心的高效科学计算程序设计框架

根据现有科学计算的特点,设计出一套以python语言为中心的高效程序设计框架。

 

本框架主要将时间密集型的任务用c或c++实现,这一部集中在对时间瓶颈工作任务的处理,在通过swig将其包装(wrap)起来让python去调用;而numpy是python的一个非常有效的数值计算基础库,增强的库还有scipy,它们对数值计算的处理非常高效;Matplotlib是一个类似matlab工具的python数据绘图库,它又是建立在numpy基础上,可以实现数值计算的结果直接视图化,matplotlib通过提供QT的backend,这样可使其和Qt的binding库pyQT无缝交互。整个系统框架将科学计算中的突出问题集中解决,并且处理一体化完成。

3、测试用例

为了验证以python为中心的科学计算的高效率,采用上节提出的设计框架,以统计物理中的一个经典2D Ising模型为对象,设计程序模拟研究其在Generalized Canonical ensemble下的行为,其中还包括Wolff Cluster的实现。

本实验中,时间密集型操作在于大量Monte Carlo采样,这部分是用c++实现作为库;采样的数据又要经过复杂的统计分析,这是通过扩展的numpy类实现。程序的最上层是采用PyQT为框架,实现基本的UI控件,内嵌一个matplotlab backend 绘图控件将数据结果实时显示出来,而该控件又调用swig包装的C++ Ising 类实现Ising 模型上的核心算法。本程序统一了各部分需求,方便了通过UI控制,进行高效实验模拟和研究分析。【youtube在线演示】 

4、分析讨论

4.1、关于时间效率

python语言以数据结构高级为最大特点,当然难免有些时间开销,但对于CPython,它提供c/c++库的直接调用,当接口调用时间相对于c/c++库函数的运行时间很小的时候,那么整个时间将取决于c/c++库函数的运行时间,显然把时间密集性任务放在c/c++库中实现,将使得python和c/c++几乎有相同的时间效率。【测试】c/c++作为一种中级程序设计语言很好地补充了相对高级的python语言在时间效率上的不足。python能够调用c/c++库,那么在python的框架下实现MPI和openMP的并行化调用也一定可行。如果对时间效率问题不是特别强的要求,完全可以用c或者c++代替Fortran等专业语言,毕竟c/c++更灵活更普及。(注意python也可以调用fortran生成的库)。

4.2、为什么选择swig和numpy

swig是一种通用的程序转译工具,可以将c或c++转换为perl,python,java,r等多种语言的调用,比起Qt提供的SIP专用转译工具更强大,而且python的setup util可以自动识别swig格式的文件后缀(.i),自动调用swig转换为python wrap库。

numpy是一种基于C++实现的python数据库,数据结果和函数功能非常强大,用户可以通过C++进行增强,再通过swig可以很方便的实现python调用。

4.3、为什么选择PyQt

对于python的UI设计除了功能最简单的Tkinter外,还可以调用wxpython来实现,wxpython在ubuntu下的python也被当作默认库安装了。但wxpython相对PyQT有几个不足:

  • Qt/PyQt的设计文档远远比wxpython丰富,如KDE就是基于Qt的设计;
  • PyQT可以通过QDesigner或者eclipse插件可视化地实现UI设计,而wxpython只能凭空构思;
  • wxpython的系统兼容上不如PyQT好,不可用在MAC os上,更不能应用在嵌入式的系统下,而Python和QT都是跨平台实现,因此Pyqt可到处通用,而且其还有GPL版权。

wxpython面向轻量级的应用,而Qt/PyQT内部数据结构和框架丰富适合面向大型项目应用,而类似于PyQt基于LGPL的PySide库还尚不完善。

5、总结

Python语言强大的数据结构,使得程序设计非常高效率(2-3倍);丰富的库函数无所不能,在科学计算方面功能也逐渐强大起来。

本文设计的系统框架能够满足一般性需求,兼顾了时间效率和数据处理的能力,着眼于程序设计的整体进度。

6、相关链接

  1. 从Qt到python:科学计算软件的界面开发 (原文为本文作者在“科学网博客”上所写,后由于退出原因被删除,网络上有些转载,本文可以看做其后续的深入讨论)
  2. 用Python做科学计算 
  3. 非常好的PyQT入门tutorial,step by step
  4. PyQt4 Class Reference

如果你觉得本站对你有帮助,欢迎向本站赞助 :P

使用支付宝捐赠

Copyright© Python4cn(news, jobs) simple-is-better.com, 技术驱动:powered by web.py 空间主机:Webfaction

版权申明:文章转载已注明出处,如有疑问请来信咨询。本站为 python 语言推广公益网站,与 python 官方没有任何关系。

联系/投搞/留言: en.simple.is.better@gmail.com 向本站捐赠