Python 速度慢但开发效率高:为何它仍是首选语言
写在前面
我们来讨论一个经常被提及的问题:Python 的性能。作为 Python 的忠实拥趸,我在各种场景下都积极尝试使用 Python 来解决问题。大家对 Python 最大的抱怨就是它的运行速度慢。有些人甚至因为 Python 的速度不如 C++ 或 Go 而拒绝使用它。本文将阐述,即便 Python 运行速度较慢,为什么它在现代开发中依然值得尝试。
优化你最昂贵的资源。
历史上,程序最昂贵的资源是计算机的运行时间。这导致了对计算机科学的研究更专注于不同算法的效率。然而在当下环境中,这已经不再适用。硅的价格已经十分便宜,硬件成本大幅下降。运行时间不再是你最昂贵的资源。一个公司最昂贵的资源现在是其雇佣的员工的时间。也就是开发者自己的时间。对现在的公司来说,完成项目比让项目跑得更快更重要。
你也许会说'我们公司对性能要求很高,我构建的网站应用需要所有的请求在 X 毫秒内返回。'或者'客户认为我们的应用慢而放弃使用我们的应用。'在这里我不是说速度根本不重要,我只是想说明速度不再是最重要的指标,因为它不再是你最昂贵的资源。
![图片]
速度不再关键
在编程的世界中当你提到速度,一般是指程序的性能,也就是 CPU 周期。而当你的 CEO 提到速度,他通常指的是业务上的速度,其中最重要的是投入市场的时间(Time to Market)。你的产品或网络应用有多快并不重要,应用采用哪种语言编写的也不重要,甚至是使项目运行投入了多少资金都不重要。最终,唯一能够让你的公司存活下来的是产品投入市场的时间。
这里不是指初创公司观念中的盈利时间,而更多是从想法转换到实际消费者手中所花费的时间。在商业世界中能存活下来的唯一方法是比你的竞争对手更快地进行创新。如果你的竞争对手比你更早地发布产品,那么你有再多的好点子也无济于事。你必须成为市场的第一个进入者,或至少要赶上领先的节奏。一旦你掉队了,那么你就大势已去。
在商业世界中能存活下来的唯一方法是比你竞争对手更快地进行创新。
微服务的例子
亚马逊、谷歌、Netflix 等公司深刻理解速度的重要性。它们创建了一个能快速发展和创新的业务系统。微服务就是这个问题的解决方案。本文并不讨论你是不是应该使用微服务,但最起码这些大公司认为它们应采用微服务。
![图片]
微服务天生就很慢。微服务的最基础的概念就是拆分业务边界,并通过网络调用来相互通讯。这也就意味着你需要把一个只占几个 cpu 周期的方法调用转换成网络调用。从性能层面上来说,这简直糟糕透顶。网络调用的速度和 CPU 调用根本不可同日而语。但是那些大公司仍然选择使用微服务。没有比微服务更慢的架构了。
微服务的最大劣势就是其性能,但是它所带来的最大好处是缩短了投入市场需要的时间。通过构建小型项目和少量代码的团队,公司可以以一个非常快的速度进行迭代与演进。这个例子只是为了展示不仅仅是初创公司,大公司也关注投入市场所需的时间。
CPU 并非你的瓶颈
如果你编写像网络服务器上的网络应用,那么 CPU 时间可能并非你应用的瓶颈。当你的网络服务器处理一个请求,它可能会需要调用多个网络调用,例如数据库或 Redis 缓存。这些服务本身速度很快,然而网络调用的过程却很慢。
一篇博客很好地描述了各个特定操作速度上的差别。如果单个 CPU 周期对应一秒的话,一个从加利福尼亚到纽约的网络调用就大约相当于 4 年。对,网络调用就是这么慢。粗略地估计,在同一数据中心内的一个普通的网络调用需要 3 毫秒,这在前面的对应关系下相当于 3 个月。现在假如你的程序是 CPU 密集型的,需要花费 100,000 个 CPU 周期来处理一次调用。按之前的比例来算,这些时间相当于 1 天。那么如果你用一个慢 5 倍的语言,它也就只花费了 5 天。相对于 3 个月的网络调用,4 天的差别就无足轻重了。
说了这么多我只是想说,即便 python 很慢,但这并不重要。语言的速度(也就是 CPU 时间)几乎不会导致问题。谷歌就这个概念做过一个研究,并写了一篇论文。论文中谈论了设计高吞吐量的系统。在结论中这样描述到:
在一个高吞吐量的环境中使用一个解释型语言看似矛盾,但是我们发现 CPU 时间几乎不是瓶颈因素,表达性强的语言意味着大部分代码是短小的,大多数时间花费在了 I/O 以及原生代码运行时上。
简单说来:CPU 时间几乎不是瓶颈因素。
那如果 CPU 时间的确是系统的瓶颈呢?
你可能会说'这观点很好,但是我们确实在 CPU 上遇到了瓶颈,造成了我们网络应用的速度缓慢',或者'在服务器上 X 语言相对 Y 语言需要更少的硬件资源来运行。'这可能都是事实。但网络应用的优势就是你可以几乎无限地进行负载均衡。换而言之,就是使用更多的硬件资源。当然 Python 相较其他语言,如 C 语言,可能需要更多硬件资源。那就使用更多的硬件来解决这个问题。硬件相对于你的人工时间便宜许多。如果你一年内节约了几周的开发时间,这就远胜于你在硬件上所节约下来的花费。
那么,Python 到底快不快?
前面我谈论了最重要的是开发所花费的时间。但是问题还是没有得到回答:Python 的开发时间的确比其他语言快么?经过多方调查,我、谷歌以及许多第三方结论都会告诉你 Python 能提升多大产能。Python 抽象化了诸多内容,可以让你专注于你真正的业务逻辑,而不用关心你是应该使用 vector 还是 array 等底层细节问题。


