1.2 为什么使用Python进行数据分析
Python语言极具吸引力。自从1991年诞生以来,Python如今已经成为最受欢迎的解释型编程语言,其他的解释型语言包括Perl、Ruby等。自2005年起,由于拥有大量的Web框架(例如Ruby的Rails和Python的Django),使用Python和Ruby构建网站变得尤为流行。这些语言常被称作脚本语言,因为它们可以用于编写简短的程序代码,或者编写自动化控制其他任务的脚本。但我个人并不喜欢“脚本语言”这个词,因为它的潜在意思好像是说这些语言无法用于构建正规的大型软件。在众多解释型语言中,由于各种历史和文化原因,Python孕育了一个庞大而活跃的科学计算和数据分析社区。在过去的20年间,Python从一门边缘或“自担风险”的科学计算语言成长为学界和工业界数据科学、机器学习、软件开发最重要的语言之一。
在数据分析、交互式计算以及数据可视化方面,Python不可避免地与其他开源和商业领域的特定编程语言和工具进行对比,例如R、MATLAB、SAS、Stata等。由于近年来Python的库(例如pandas和scikit-learn)不断得到优化,越来越多的人使用Python进行数据分析。再加上Python在通用编程方面的强大能力,它已成为构建数据应用的优选方案。
1.2.1 Python作为胶水语言
Python在科学计算领域的成功,部分得益于它能够轻松集成C、C++以及Fortran代码。大部分现代计算环境都利用了一些Fortran和C库来实现线性代数运算、最优化、积分、快速傅里叶变换以及其他诸如此类的算法。许多企业和国家实验室也利用Python来“黏合”那些已经用了数十年的遗留软件。
大多数软件都是由两部分代码组成的,一小部分需要占用大部分执行时间的代码,以及大部分不经常执行的“胶水代码”。在许多情况下,胶水代码的执行时间都是微不足道的。开发人员的精力几乎都花在优化计算瓶颈上,有时更需要转换为底层的语言(比如C语言)。
1.2.2 解决“双语”问题
通常,很多机构都会使用专业领域的计算语言(如SAS和R)针对新想法做研究、构建原型和测试,然后再将这些想法移植到规模更大的生产系统中(可能是用Java、C#或C++编写的)。人们逐渐意识到,Python不仅适用于研究和构建原型,也适用于构建生产系统。既然一种语言就足够了,还有必要维持两套开发环境吗?我相信越来越多的企业会统一开发环境,因为研究人员和软件工程师使用同一套编程工具将会给企业带来非常显著的组织效益。
在过去的十年间,涌现出一批解决“双语”问题的新途径,例如Julia编程语言。在许多场景中,为了让Python物尽其用,需要用到C或C++等底层语言,然后将Python与其相连。尽管这样有些麻烦,但即时(Just-In-Time,JIT)编译技术能让人们不必脱离Python编程环境,使用像Numba这样的库,就能在许多算法中获得卓越的性能。
1.2.3 为何不使用Python
虽然Python非常适合构建分析应用以及通用系统,但它对不少应用场景的适用性较差。
由于Python是解释型编程语言,因此通常大部分Python代码运行起来都要比用编译型语言(比如Java和C++)编写的代码慢得多。由于程序员的时间通常都比CPU时间值钱,因此许多人也愿意对此做一些取舍。但是,在那些低延迟或高资源利用率的应用(例如高频交易系统)中,为了达到最高性能,花费时间使用诸如C++这样底层(但生产效率更低)的语言进行编程也是值得的。
对于高并发、多线程的应用程序,尤其是拥有许多计算密集型线程的应用程序而言,Python并不是一种理想的编程语言。这是因为Python有一个叫作全局解释器锁(Global Interpreter Lock,GIL)的组件,这是一种防止解释器同时执行多条Python字节码指令的机制。有关“为什么会存在GIL”的技术性原因超出了本书的范围。虽然很多大数据处理应用程序为了能在较短的时间内完成数据集的处理工作都需要运行在计算机集群上,但是仍然有一些场景需要用单进程多线程系统来解决。
这并不是说Python不能执行真正的多线程并行代码。例如,Python的C扩展使用原生的C或C++的多线程,可以并行运行而不被GIL影响,只要它们不需要频繁地与Python对象交互。