从C#到Python —— 谈谈我学习Python一周来的体会

从大年初二开始学习 Python,到现在正好一个星期了,谈谈我的学习体会。

 

一、学习缘起

最早听说 Python 是在今年 1 月底到北京一个厂商(做汽车驾驶模拟器的)那里看设备,听他们的 CTO 介绍模拟软件的脚本控制是用的 Python,(当时我还把 Python 叫做“飞森”,而不是“派森” 囧)。第一次听说了这个语言,但也没太在意,因为导师一直跟我说用好一门语言就够了。从上大学到现在,先后用过 C、Basic、C++ 以及 ASP(一看就不是计算机专业的,我大学认识的几个计算机专业的同学,大多都是 Pascal - Delphi - Java 这条路线)。这几年主要在用 C#,觉得 C# 还不错,又可以做本地程序,也可以做 ASP.NET 程序,所以也没想再学其他语言了。

寒假做了一个交通网络分析的计算程序,这个程序前期已经有一些基础了,核心算法用的是QuickGraph库。QuickGraph 提供了经典图论里边的绝大部分算法,如最短路、最大流、遍历、支撑树等,不错的一个东西,但是没有复杂网络分析的算法。一开始我是利用 QuickGraph 的数据结构,然后自己写复杂网络分析算法。但是写的很累,正好也过年了,就暂时放下了这个工作。

过年的时候闲着没事,上网找是不是有直接提供复杂网络分析算法的库,还真找到了两个:igraph 和 networkx。(见http://igraph.sourceforge.net/http://networkx.lanl.gov/),其中,igraph 是用 C 写的,但提供了 Python 的接口;networkx 就纯粹是用 Python 实现的一个库了。下载了它们的文档,发现正是我想要的东西:成熟的复杂网络分析算法,大量的示例程序。要想直接利用这两个库,肯定要学 Python 语言了。我想,反正各种语言都差不多,学就学吧。

二、语法

学语言肯定要先从基本语法学起。Python 的语法的确很简单,因为有 C#编程基础,学习起来没遇到什么困难。比起 C#,Python 少了花括号,完全靠缩进解决结构问题。一开始我不太习惯,特别是写函数定义、循环控制等语句时总丢后边的冒号。现在好多了,习惯会慢慢养成(现在变成写 C# 程序总加冒号,然后调试器就开始不停的问候我 囧)。另外 Python 没有 switch,因为我做科学计算,涉及到条件控制比较多,一开始用 ifelifelif……觉得很烦人,后来发现用 dict 就很方便,比 switch 还要简单优美。

说到 dict 呢,顺便说一下 Python 内置的 list、tuple 和 dict 类型。这个的确很方便,在 C# 里做同样的事情要引用 Collections,而 Python 就简单的多了,对于做科学计算的确简化了许多工作。不过 Python 用类型不事先定义,一开始我还是不太习惯,总是 int a,str b 的,后来发现,这不就是 C#里的 generics 嘛!是个好东西啊!而且 Python 的函数功能也很强大,有匿名函数、多返回值、列表内涵、关键字参数等等,极大的简化了编程工作。最早在 STL、Boost 及 C# 里看到这些特性的时候我还惊为天人,学了 Python 才知道这东西也没那么神秘——基本手段嘛。

此外,Python 还有一个很 nice 的功能就是 exec、execfile 和 eval。对我来说这个非常实用,因为做计算时总有些函数需要在运行时才导入,例如 y =a +func(b),func() 的形式事先不知道,运行时根据用户需要输入。以前用别的语言实现这个功能要费好大劲(用表达式解析器等),现在 Python 直接内置了它。换句话说,Python 可以作为 Python 程序自己的脚本语言!Python 实在也太强大了!正如那句 Python 社区中很有名的话所说的:“battery included”!要我说,Python 不仅带了电池,充电器它 TMD 都带着呢!


三、库及跨平台

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 之类的小册子,头天睡前翻一翻,第二天就可以写出想要的东西来。

四、Web 开发

我学 Python 的主要目的是为了做一些数值计算的小程序,因为做网络分析总是要对大量的数据进行分析计算,Python 简洁的语法和丰富的第三方库可以极大地提高我的工作效率。不过作研究只是为了兴趣,要养家糊口还是要做一些短平快的项目(惨!)。这两年做的比较多的就是与工程相结合的 Web 应用(因为我导师的方向是 GIS 与交通设计信息化)。以前一直是用 ASP.Net 在做,从 1.0 到 2.0 再到 3.5,一路做下来对 ASP.Net 已经比较熟了。因为学 Python,也特意关注了一下 Python 的 Web 开发功能。

现在看来似乎 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 语言的一个主要考虑。

 

注 1
"""注 1:引自百度百科 http://baike.baidu.com/view/21087.htm:
在实际开发中,python 常被昵称为胶水语言,这不是说他会把你的手
指粘住,而是说他能够很轻松的把用其他语言制作的各种模块(尤其是
C/C++)轻松地联结在一起。常见的一种应用情形是,使用 python 快
速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别
要求的部分,用更合适的语言改写,比如 3D 游戏中的图形渲染模块,速
度要求非常高,就可以用 C++ 重写。
"""

 

六、总结

作为一个刚从 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 排版很适合用手机在线阅读,推荐给大家:)
"""