前言:
多年前我第一次接触Python,在此之后便成为 Python 的疯狂爱好者。
在工作中能用程序自动化实现的,我都尽可能积极的使用 Python,工作效率有了质的飞跃;
由此,我慢慢地了解到了 GIL,也通过尝试知道了在计算密集行任务方面,Python 的性能表现也许的确不如 Java,Golang 等静态语言,正因如此,有很多人开始不再尝试使用 Python,但在这里我想说,从我这些年的从业经历来看,Python 并没有让我觉得"慢",即使让我去与其他语言相比;也许它不如其他语言快,但对我来说并没有什么影响,在这里我归纳了几个我认为Python不影响实用操作的原因,不知是否会与你们引起共鸣:
1. 速度真的有那么重要吗?并不见得。
过去,程序要花很长时间才能运行。CPU、内存都很昂贵,程序的运行时间是一个非常重要的指标,电脑非常贵,运行它们的电费也很贵,而商业永恒不变的法制就是---优化你最贵的那部分资源。从历史来看,最昂贵的就是计算机的运行时间,这也是商业和科学研究的重点,算法,编译优化,都是为了让程序更快的完成。
现在计算机不那么贵了,每个人都有了自己的电脑,不少人都有了自己的个人网站(服务器),硬件的性能也像摩尔定律那样提升了很多,计算机的运行时间不在昂贵,而昂贵的是你的时间,本质上讲,老板雇佣你,就是购买的你的可支配时间。毫无疑问,同样的功能,Python 是最节省你的时间的。
你也许会说,我的公司在乎速度,我创建了一个 web 应用程序,需要在毫秒内响应,或者说客户会取消下单因为我们的应用太慢了。我并不否认速度不再重要,我想说的是 速度并不是你最昂贵的资源,最昂贵的是你的时间,或者你公司抢占市场的先机,也就是说你的编程速度是最昂贵的资源。
2. 微服务的兴起,意味着时代的更迭。
像亚马逊、谷歌、奈飞等公司都知道快速行动的重要性,他们创建的业务系统可以快速部署和创新,微服务是其解决问题的方法,本文不讨论是否该使用微服务,但至少亚马逊、谷歌、奈飞觉得应该使用微服务。而微服务本来就慢,本来一个调用一个函数搞定,现在搞调用一个网络接口。一个函数也就若干个 CPU 周期,而一个网络接口却是 TCP 的三次握手和四次挥手,如果假设一个 CPU 周期是 1 秒的话,那么从加尼福利亚到纽约的网络访问时常则是 4 年。微服务最大的缺点就是慢,最大的优点就是可以快速出产品,快速上市。微服务的流行正说明,现在这个时代吗,产品迭代开发速度远比程序的运行速度更重要。
3. CPU 已不再是瓶颈。
如果你编写 WEB 应用,那么 CPU 的时间已经不是瓶颈。还是刚才的例子,如果假设一个 CPU 周期是 1 秒的话,那么从加尼福利亚到纽约的网络访问时常则是 4 年,比如说同一数据中心内部的网络通信大约 3 毫秒,这相当于人类的 3 个月,假设你用其他较快的编程语言 X 响应一次请求需要 100000 个 CPU 周期,这相当于人类的 1 天,也就是说总的响应时间是 3 个月+ 1 天。现在,就算 Python 比 X 慢 5 倍,也就是说总的响应时间是 3 个月+ 5 天,你觉得区别大吗?假如需要 3 个月后才能收到快递,那么再多等个四天,基本上没有多大关系。
这就意味着,即使 Python 有点慢也没关系,也就是说语言的速度( CPU 时间)几乎不是问题,Google 对此进行了研究并发表了论文[https://static.googleusercontent.com/media/research.google.com/en//archive/sawzall-sciprog.pdf],大致意思如下:在高吞吐量环境下使用解释型语言看起来很矛盾,但我们发现 CPU 时间极少是限制因素,编程语言的可表达性意味着大多数程序都很小,大部分时间都是花在 I/O 操作和本地运行时代码上,此外解释型语言在允许我们将计算结果分布到许多机器上很有帮助。
4. CPU 时间就是瓶颈吗?
你可能会说,我们遇到的问题就是 CPU 是瓶颈,导致 WEB 应用访问很慢,或者说语言 X 就是比语言 Y 快,没错,有时确实如此。不过,WEB 服务器的妙处在于你几乎可以无限制的进行负载均衡,最简单粗暴的方法,就是升级 CPU 或硬件,与你的时间相比,这些硬件非常便宜,如果一年节省你几个星期的时间,这足以支付增加的硬件成本。
此外 Python 还可以调用 C 语言或 Java 的函数,如果你觉得某一块慢,可以使用其他语言改写,再用 Python 调用,此外还可以了解下 Cython,可以把 Python 代码编译为 C 代码来提升速度。
5. Python 更快吗?
前面一直在说,最重要的是开发时间的长短,那么 Python 更快吗?我可以明确的告诉你,Python 的生产率更高,它可以帮助你更专注于真正要编写的代码,而不会陷入细小的杂草中(你不用考虑用 vector 好还是 array 好),下面是一组数据来自一项研究论文:
不同语言编写一个字符串处理程序所花费的时间
可以看出 Python 的生产力是 Java 的 2 倍以上。可以说 Python 比其他许多语言的生产力更高,主要是由于 Python 的内省和大量的第三方库。
6. 如果运行时间确实有影响呢?
有些情况下,运行时的性能确实很重要,那就需要优化,但不要过早优化,在不了解瓶颈的情况下进行优化,成为过早优化。过早优化会浪费你宝贵的时间,你应该找到瓶颈(最昂贵的资源),然后进行针对的优化。
7. 小结一下
最后,小结一下吧
1、针对最昂贵的资源进行优化,而不是计算机。
2、选择可以帮助快速开发的语言或框架
3、当你遇到性能问题时要找到瓶颈,很可能不是 CPU 或 Python 本身。
4、如果 Python 是瓶颈(已经优化了算法),请将关键代码转至 Cython 或 C 语言。
享受 Python 快速完成工作的过程吧!