python构架的科学计算程序设计(转载)

来源:互联网 发布:java random用法 编辑:程序博客网 时间:2024/06/07 01:49

这是一篇转载文章,同意作者想法。在工作中尝试了一次,不过是在c++中调用python,项目开始一翻风顺,“享受编程的乐趣”,但涉及到在QT的多线程中嵌套python的多线程,开始无助,更别提之间通讯。最终放弃了。原因:个人水平,项目时间有限,没有深入研究。方向问题,应该是python调用c/c++,反过那就是"偷懒"。

----------------------------------------------

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

 

参考:

高效科学计算程序设计(原创)
http://blog.sciencenet.cn/home.php?mod=space&uid=203570&do=blog&id=431577

python的学习资料
http://wiki.woodpecker.org.cn/moin

 

原创粉丝点击