从C#到Python —— 谈谈我学习Python一周来的体会
转自http://www.cnblogs.com/yanxy/archive/2010/02/22/ILovePython.html
从大年初二开始学习Python,到现在正好一个星期了,谈谈我的学习体会。
寒假做了一个交通网络分析的计算程序,这个程序前期已经有一些基础了,核心算法用的是QuickGraph库。QuickGraph提供了经典图论里边的绝大部分算法,如最短路、最大流、遍历、支撑树等,不错的一个东西,但是没有复杂网络分析的算法。一开始我是利用QuickGraph的数据结构,然后自己写复杂网络分析算法。但是写的很累,正好也过年了,就暂时放下了这个工作。
过年的时候闲着没事,上网找是不是有直接提供复杂网络分析算法的库,还真找到了两个:igraph和networkx。(见http://igraph.sourceforge.net/和http://networkx.lanl.gov/),其中,igraph是用C写的,但提供了Python的接口;networkx就纯粹是用Python实现的一个库了。下载了它们的文档,发现正是我想要的东西:成熟的复杂网络分析算法,大量的示例程序。要想直接利用这两个库,肯定要学Python语言了。我想,反正各种语言都差不多,学就学吧。
Python的第三方库很多,特别是计算这一块,Python比C#的库要丰富一些,而且用的人更多。我现在已经用了igraph和networkx(图论与复杂网络)、numpy和scipy(数值计算)以及matplotlib和cairo(图表和可视化),python(x,y)项目里还集成了更多的科学计算库。当然这和搞科学计算的老外大多用非windows平台有关,我接触的多数人都是用unix/linux平台(给人家发Email都不好意思带word附件),在这些平台下虽然有Mono支持C#,但用的人毕竟还少。C和Fortran的科学计算库倒是不少,不过多数都提供了Python的封装或Python写的替代品,所以就不需要自己重复造轮子了。我现在已经完全放弃了扩展那个QuickGraph的想法,因为我再作两年也赶不上igraph和networkx,而且关键是我做的东西还没人用 囧……
此外,Python可用的GUI库也很多:Tkinter,wxPython,PyQt,PyGTK,PyWin等等一大堆。除了PyWin,大多数GUI都是跨平台的。这点很好,再也不用担心MS卡脖子了(偶现在还是在用D版,以后限制严格了就到Linux下接着做这点事),自己的知识、技术可以一直积累延续,而不用从头开始。当然GUI库不可能都学都用,学好一个应该就够了。试了上面几个库后,我选择了PyQt4,原因是看到它Demo里做的东西比较漂亮,而且Qt的信号/插槽(signals/slots)机制也比回调(callback)机制好理解。此外,对初学者很重要的一点是,Qt的中文书比wxPython要多。注意不是PyQt,PyQt的中文书还是比较少的。wxPython我只找到了一本很厚的《wxPython In Action》。书是不错,不过我比较怕看厚书,因为时间总是有限的,最好都是In Nutshell之类的小册子,头天睡前翻一翻,第二天就可以写出想要的东西来。
现在看来似乎Django很热(这个我又不知道应该怎么念,不过恰好我有个朋友叫"邸建国",所以我第一眼看到Django就念成这个音了 :)。
百度百科上介绍说"Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则"。听上去不错,上网找到了Python高手
limodou的《Django Step by Step》教程,粗看了一下没有入门,暂时还是先用我的ASP.Net吧,因为我感觉目前ASP.Net可用的资源更多,对我来说更加DRY。以后有闲了再慢慢跟"邸建国"切磋。
因为做科学计算,我很重视语言及开发环境的"轻量级"。什么叫"轻量级"呢?对我来说就是在我256M内存的老本上能欢快地跑起来 囧……。我的烂机是单位淘汰的一台联想昭阳V80,CPU是P4 1.6的,让他跑.Net 3.5的确是难为他老人家了!所以在这台机器上我主要用Dev C++和SharpDevelop(Visual Studio在这台机器上启动都很困难)作数值计算的程序。我的另外一台本本是小黑X61,这个性能还可以,我用它上网、写论文、玩游戏等等(不过X61的显卡很弱,做OpenGL的程序时得到单位的工作站上,当然玩实况和FIFA也得去那个工作站上:)。因为大规模网络分析花的时间会比较长(几小时到几天),这些计算的脏活累活就扔给V80了。现在用Python,IDE我选了PythonWin和Spyder(见我的另一篇文章),感觉这两个IDE还比较轻量,很适合我的硬件环境。
Python的运行效率我感觉和C#差不多,因为都用了虚拟机,但Python比C/C++还是要差一截。我对比了igraph(C写的)和networkx(Python写的)两个库,生成同样规模的一个随机图,igraph比networkx运行时间少一个数量级(Drew Conway做的对比结果也类似,见这里)。换句话说,对于大规模的网络分析问题就是等几小时和等几天的区别了。不过还好,大多数老牌的科学计算库都是用C和Fortran写的,并且提供了Python接口,所以也不必太担心。我们可以把Python当作"胶水"[1]来用:对于效率要求很高的部分,就调用C/C++库或自己写C/C++的模块,这也是我选择Python语言的一个主要考虑。
六、总结
作为一个刚从C#转到Python的FreshMan,一周来的总体感觉就是:Python的确易学、易用、强大。像我这样的非计算机专业毕业、非程序员工作的人,一星期就已经入门Python,并且能用它写出自己"用着方便、看着舒服"的程序。很符合我学Python的预期:提高自己的工作效率;也印证了Bruce Eckel的观点:"Python可能是唯一一种旨在帮助程序员把事情弄得更加简单的语言"[2]。
"""注2:引自《简明 Python 教程》第一章,
http://www.woodpecker.org.cn:9081/doc/abyteofpython_cn/chinese/ch01s04.html,
这本书是适合新手阅读的一部好书,舒服的web排版很适合用手机在线阅读,推荐给大家:)"""
附:《从C#到Python》系列连载目录
从C#到Python —— 谈谈我学习Python一周来的体会
从C#到Python —— 0 前言:进入Python的世界
从C#到Python —— 1 变量和数据类型
从C#到Python —— 2 运算符、表达式和流程控制
从C#到Python —— 3 函数及函数编程
从C#到Python —— 4 类及面向对象
从C#到Python —— 5 模块和包
New! 从C#到Python —— PDF整理版(下载地址)