是的,Python是慢,但我不在乎

Python七号

共 2513字,需浏览 6分钟

 ·

2020-10-24 08:45

几年前我做运维时用到 Python,从此便成为 Python 的狂热分子,工作上能用程序自动化实现的,我都尽可能积极的使用 Python,极大的提高了工作效率,不知道的以为我的工作是个闲职,导致我“丢”掉了运维岗位,也罢,重复的事情做多了也就乏味了



慢慢的我知道了 GIL,也通过尝试知道了在计算密集行任务方面,Python 的性能表现的确不如 Java,Golang 等静态语言,有人也因此拒绝尝试使用 Python,但是从我自身的经历来看,Python 并未让我觉得慢,即使与其他语言相比,有点慢,但我并不在乎,原因如下:


一、速度不再那么重要。


过去,程序要花很长时间才能运行。CPU、内存都很昂贵,程序的运行时间是一个非常重要的指标,电脑非常贵,运行它们的电费也很贵,而商业永恒不变的法制就是---优化你最贵的那部分资源。从历史来看,最昂贵的计算机的运行时间,这也是商业和科学研究的重点,算法,编译优化,都是为了让程序更快的完成


现在计算机不那么贵了,每个人都有了自己的电脑,不少人都有了自己的个人网站(服务器),硬件的性能也像摩尔定律那样提升了很多,计算机的运行时间不在昂贵,而昂贵的是你的时间,本质上讲,老板雇佣你,就是购买的你的可支配时间。毫无疑问,同样的功能,Python 是最节省你的时间的。


你也许会说,我的公司在乎速度,我创建了一个 web 应用程序,需要在毫秒内响应,或者说客户会取消下单因为我们的应用太慢了。我并不否认速度不再重要,我想说的是速度并不是你最昂贵的资源,最昂贵的是你的时间,或者你公司抢占市场的先机,也就是说你的编程速度是最昂贵的资源。


二、微服务的流行。


像亚马逊、谷歌、奈飞等公司都知道快速行动的重要性,他们创建的业务系统可以快速部署和创新,微服务是其解决问题的方法,本文不讨论是否该使用微服务,但至少亚马逊、谷歌、奈飞觉得应该使用微服务。而微服务本来就慢,本来一个调用一个函数搞定,现在搞调用一个网络接口。一个函数也就若干个 CPU 周期,而一个网络接口却是 TCP 的三次握手和四次挥手,如果假设一个 CPU 周期是 1 秒的话,那么从加尼福利亚到纽约的网络访问时常则是 4 年。微服务最大的缺点就是慢,最大的优点就是可以快速出产品,快速上市。微服务的流行正说明,产品迭代开发速度比程序的运行速度更重要。


三、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 操作和本地运行时代码上,此外解释型语言在允许我们将计算结果分布到许多机器上很有帮助。


四、CPU 时间就是瓶颈怎么办?


你可能会说,我们遇到的问题就是 CPU 是瓶颈,导致 WEB 应用访问很慢,或者说语言 X  就是比语言 Y 快,没错,有时确实如此。不过,WEB 服务器的妙处在于你几乎可以无限制的进行负载均衡,最简单粗暴的方法,就是升级 CPU 或硬件,与你的时间相比,这些硬件非常便宜,如果一年节省你几个星期的时间,这足以支付增加的硬件成本。


此外 Python 还可以调用 C 语言或 Java 的函数,如果你觉得某一块慢,可以使用其他语言改写,再用 Python 调用,此外还可以了解下 Cython,可以把 Python 代码编译为 C 代码来提升速度。


五、Python 更快吗?


前面一直在说,最重要的是开发时间的长短,那么 Python 更快吗?我可以明确的告诉你,Python 的生产率更高,它可以帮助你更专注于真正要编写的代码,而不会陷入细小的杂草中(你不用考虑用 vector 好还是 array 好),下面是一组数据来自一项研究论文:


不同语言编写一个字符串处理程序所花费的时间


可以看出 Python 的生产力是 Java 的 2 倍以上。可以说 Python 比其他许多语言的生产力更高,主要是由于 Python 的内省和大量的第三方库。


六、如果运行时间确实有影响呢?


有些情况下,运行时的性能确实很重要,那就需要优化,但不要过早优化,在不了解瓶颈的情况下进行优化,成为过早优化。过早优化会浪费你宝贵的时间,你应该找到瓶颈(最昂贵的资源),然后进行针对的优化。


小结:


1、针对最昂贵的资源进行优化,而不是计算机。

2、选择可以帮助快速开发的语言或框架

3、当你遇到性能问题时要找到瓶颈,很可能不是 CPU 或 Python 本身。

4、如果 Python 是瓶颈(已经优化了算法),请将关键代码转至 Cython 或 C 语言。


享受 Python 快速完成工作的过程吧!


希望你喜欢此外,请点赞、转发、关注支持,谢谢老铁!

浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报