1.2 为何利用Python进行数据分析
对很多人来说,Python编程语言拥有强大的吸引力。从1991年面世以来,Python与Perl、Ruby等语言成为最流行的解释型语言。Python和Ruby从2005年之后格外流行,可以基于众多web框架,比如Rails(Ruby)和Django(Python)进行网站搭建。此类语言通常称为脚本语言,因为它们可以用于快速编写小型程序、脚本或对其他任务进行自动化。我并不喜欢“脚本语言”这个术语,因为它的言外之意似乎是“脚本语言”无法构建大型软件。在解释型语言中,由于历史和文化上的原因,Python发展出了一个大型、活跃的科学计算及数据分析社区。在过去十年里,Python已经从一个最前沿或者说“后果自负”的科学计算语言,成为数据科学、机器学习和学术/工业界通用软件开发等领域最为重要的语言之一。
在数据科学、交互式计算以及数据可视化等领域,Python经常被拿来和其他开源或商业编程语言、工具进行对比,比如R、MATLAB、SAS、Stata等。近些年,Python提高了对类库的支持(比如pandas和scikit-learn),使得它成为数据分析任务的一个流行选择。再综合考虑Python在通用软件工程上的总体实力,它便成为搭建数据应用的首选语言。
1.2.1 Python作为胶水
Python在科学计算方面的成功部分是因为它很容易整合C、C++和FORTRAN等语言的代码。大部分现代计算环境都拥有相似的存量程序集,这些程序集使用FORTRAN和C的库进行线性代数、调优、积分、快速傅里叶变换等算法运算。很多公司和国家实验室都使用Python将过去数十年产生的存量软件黏合在一起。
很多程序中包含了一小部分运行起来要花费大量时间的代码,而大量“胶水代码”却很少运行。很多情况下,胶水代码的执行时间可以忽略不计;精力应当更多地投入优化计算瓶颈的方面,有些时候需要将代码迁移到底层语言,比如C。
1.2.2 解决“双语言”难题
在许多组织中,通常会使用一种更特殊的计算语言,比如用SAS或R针对想法进行研究、原型实现和测试,之后再将这些想法迁移到用Java、C#或C++编写的大型生产环境上。逐渐地,人们发现Python不但更适用于研究和原型实现,也适合搭建生产系统。当一种语言可以满足需求时,为什么要维持两个开发环境呢?当使用相同程序工具集来兼顾研究人员和软件工程师的好处越发明显时,我认为会有越来越多的公司选择走使用一种语言的路线。
1.2.3 为何不使用Python
虽然Python可以为很多分析应用和通用系统提供一个优秀环境,但仍然有一些场景用Python并不合适。
由于Python是一个解释型语言,大多数情况下Python代码的运行效率会低于Java或C++等编译型语言。因为开发者时间通常比CPU时间更有价值,很多人就愉快地选择了使用Python。然而,当需要一款低延迟、高资源利用要求的应用时(例如高频交易系统),为了尽可能获得最高性能,在底层语言(也意味着更低的代码生产力)比如C++上花费编程时间将会更加值得。
当搭建高并发、多线程应用,尤其是多CPU绑定线程时,使用Python则会成为一项挑战。原因在于Python拥有全局解释器锁(GIL),这是一种防止解释器同时执行多个Python指令的机制。GIL存在的技术原因超出了本书的讨论范围。然而在大数据处理应用中,计算机集群需要在合理时间内处理一个数据集,单进程多线程系统的场景仍然是有需求的。
这并不是说Python无法执行真正的多线程、并行代码。Python的C语言拓展使用本地多线程(在C或C++中)以并行方式运行代码,而不受GIL的影响,因为这些拓展通常无须与Python对象交互。