[翻译] 是的,Python 很慢,我不关心

本贴最后更新于 1937 天前,其中的信息可能已经物是人非

原文链接:https://hackernoon.com/yes-python-is-slow-and-i-dont-care-13763980b5a1

我正在讨论关于 Python 中的 asyncio 的讨论,以谈谈我最近想到的一些事情:Python 的速度。对于那些不知道的人,我有点像 Python 粉丝,我尽我所能积极地使用 Python。人们对 Python 的最大抱怨之一就是它很慢。有些人几乎拒绝尝试 python,因为它比 X 慢。这是我的想法为什么你应该尝试 python,尽管它很慢。

速度不再重要

过去,程序需要很长时间才能运行。CPU 价格昂贵,内存昂贵。程序的运行时间曾经是一个重要的指标。计算机非常昂贵,运行它们的电力也是如此。由于永恒的商业法,优化了这些资源:

优化您最昂贵的资源。

从历史上看,最昂贵的资源是计算机运行时间。这导致了计算机科学的研究,其关注于不同算法的效率。然而,这已不再适用,因为硅现在很便宜。就像便宜。运行时间不再是您最昂贵的资源。公司最昂贵的资源现在是员工的时间。或者换句话说,你。完成任务比让它快速完成更重要。事实上,这是非常重要的,我将把它再次放在这里,好像它是一个引用(对于那些只是浏览的人):

完成任务比让它快速完成更重要。

您可能会说,“我的公司关心速度,我构建一个 Web 应用程序,所有响应都必须快于 x 毫秒。”或者,“我们让客户取消,因为他们认为我们的应用程序太慢了。”我不是试图说速度根本不重要,我只是想说它不再是最重要的事情;这不是你最贵的资源。

速度!

速度是唯一重要的事情

当您在编程环境中说_速度_时,通常表示性能,即 CPU 周期。当你的 CEO 说_速度时_在编程的背景下,他意味着商业速度。最重要的指标是上市时间。最终,您的产品/网络应用程序的速度并不重要。它写的是什么语言无关紧要。它甚至不需要运行多少钱。在一天结束时,让您的公司生存或死亡的一件事就是上市时间。我不只是谈论创业的想法,直到你赚钱需要多长时间,但更多的是“从创意到顾客手中”的时间框架。在企业中生存的唯一方法是比竞争对手更快地进行创新。如果您的竞争对手在您之前“出货”,那么您想出多少好主意并不重要。你必须是第一个进入市场的人,或者至少要跟上。一旦你减速,你就完成了。

在企业中生存的唯一方法是比竞争对手更快地进行创新。

一个微服务案例

亚马逊,谷歌和 Netflix 等公司都了解快速行动的重要性。他们创建了一个业务系统,可以快速移动并快速创新。微服务是他们问题的解决方案。本文与您是否应该使用微服务无关,但至少接受亚马逊和谷歌认为他们应该使用微服务。

微服务本来就很慢。微服务的概念是通过网络呼叫来打破边界。这意味着您正在进行函数调用(几个 cpu 周期)并将其转换为网络调用。在性能方面,你可以做的事情并不多。与 CPU 相比,网络调用非常慢。但这些大公司仍然选择使用微服务。实际上,我所知道的架构并不比微服务慢。微服务最大的优点是性能,但最好的专业是产品上市时间。通过围绕较小的项目和代码库建立团队,公司能够以更快的速度进行迭代和创新。这只是表明,非常大的公司也关心产品上市时间,而不仅仅是创业公司。

CPU 不是你的瓶颈

如果编写网络应用程序(例如 Web 服务器),则可能是 CPU 时间不是应用程序的瓶颈。当您的 Web 服务器处理请求时,它可能会进行一些网络调用,例如数据库,或者像 Redis 这样的缓存服务器。虽然这些服务本身可能很快,但对它们的网络调用速度很慢。关于某些操作的速度差异,有一篇非常棒的博客文章。在本文中,作者将 CPU 周期时间缩放到更易理解的人类时代。如果单个 CPU 周期相当于 1 秒,那么从加利福尼亚到纽约的网络呼叫将相当于 4 年。那就是网络速度慢了多少。对于一些粗略估计,假设同一数据中心内的正常网络呼叫大约需要 3 毫秒。这相当于我们“人类规模”的 3 个月。现在假设您的程序非常占用 CPU,响应单个调用需要 100,000 个周期。这相当于超过 1 天。现在让我们假设你使用的语言慢了 5 倍,现在大约需要 5 天。那么,将它与我们 3 个月的网络电话进行比较,4 天的差异根本不重要。如果有人必须等待至少 3 个月的包裹,我不会

这最终意味着,即使 python 很慢,也没关系。语言的速度(或 CPU 时间)几乎不是问题。谷歌实际上对这个概念进行了研究,他们写了一篇论文。本文讨论了设计高吞吐量系统。在结论中,他们说:

在高吞吐量环境中使用解释语言似乎有些自相矛盾,但我们发现 CPU 时间很少是限制因素;语言的可表达性意味着大多数程序都很小,并且大部分时间都花在 I / O 和本地运行时代码上。此外,解释实现的灵活性有助于简化语言层面的实验,并允许我们探索在多台机器上分配计算的方法。

或者,强调:

CPU 时间很少是限制因素

如果 CPU 时间什么一个问题?

你可能会说,“这是伟大的,所有的,但我们不得不在那里 CPU 是我们的瓶颈,引起了我们的 web 应用程序太多放缓问题”,或“语言_X_需要的不仅仅是语言的运行速度大幅较少的硬件_Ÿ_在服务器上。”这一切皆有可能。关于 Web 服务器的精彩之处在于,您几乎可以无限地对它们进行负载均衡。换句话说,投入更多硬件。当然,Python 可能需要比其他语言更好的硬件,例如 C.只是在你的 CPU 问题上抛出硬件。与您的时间相比,硬件非常便宜。如果您在一年内节省了几周的生产力时间,那么这将超过增加的硬件成本。


那么,Python 更快吗?

这一直是我一直在谈论最重要的是开发时间。所以问题仍然存在:在开发时间方面,Python 比语言 X 更快吗?有趣的是,我,谷歌几个,可以告诉你如何更高效 Python 是。它为您提取了很多东西,帮助您专注于您真正想要编写的代码,而不会陷入小事物的杂草中,例如是否应该使用矢量或数组。但你可能不愿意接受别人的话,所以让我们看一些更经验的数据。

在大多数情况下,关于 python 是否更高效的争论实际上归结为脚本(或动态语言)与静态类型语言。我认为普遍认为静态类型语言的效率较低,但这是一篇很好的论文,可以解释原因。特别在 Python 方面,这是一项研究的一个很好的总结,该研究着眼于为各种语言的字符串处理编写代码所花费的时间。

用各种语言编写字符串处理应用程序需要多长时间。(Prechelt 和 Garret)

在上面的研究中,Python 的效率是 Java 的 2 倍。还有一些其他研究表明同样的事情。Rosetta Code 对编程语言的差异进行了相当深入的研究。在本文中,他们将 python 与其他脚本/解释语言进行比较,并说:

Python 往往是最简洁的,甚至是功能语言(平均缩短 1.2-1.6 倍)

常见的趋势似乎是 Python 中的“代码行”总是较少。代码行可能听起来像一个糟糕的指标,但多项研究,包括已经提到的两项研究表明,每行代码花费的时间在每种语言中大致相同。因此,限制代码行数,提高了生产力。甚至编码错误本身(C#程序员)也写了一篇关于 Python 如何提高效率的文章

我认为可以说 Python 比许多其他语言更有效率。这主要是因为 python 附带“包含电池”并且有许多第三方库。这是一篇简单的文章,讨论 Python 和 X 之间的差异。如果你不知道为什么 Python 如此“小”和高效,我邀请你借此机会学习一些 python 并亲自看看。这是你的第一个项目:

import __hello__


但是如果速度确实重要呢?

运行时性能

上面几点的基调可能会让它看起来像优化,速度根本不重要。但事实是,很多时候运行时性能确实很重要。一个例子是,您有一个 Web 应用程序,并且有一个特定的端点需要很长时间才能响应。你知道它需要多快,以及它需要改进多少。

在我们的例子中,发生了几件事:

  1. 我们注意到一个端点执行缓慢
  2. 我们认为它很慢,因为我们有一个_足够快_的度量标准,并且它没有达到该指标。

我们不必对应用程序中的所有内容进行微优化。一切都只需要“足够快”。您的用户可能会注意到端点需要几秒钟才能响应,但他们不会注意到您将 35 毫秒调用的响应时间提高到 25 毫秒。“足够好”,真的是你需要实现的一切。免责声明我也许应该指出,有一些应用,如实时竞价应用中,这样做需要微优化,以及每毫秒事做。但这是例外,而不是规则。

为了弄清楚如何优化端点,您的第一步是分析代码并尝试找出瓶颈所在。毕竟:

除瓶颈之外的任何改进都是幻觉。- 吉恩金

如果您的优化没有触及瓶颈,那么您就是在浪费时间而不是解决真正的问题。在优化瓶颈之前,您不会得到任何重大改进。如果你在知道瓶颈之前尝试进行优化,那么你最终只能使用部分代码来玩耍。在测量和确定瓶颈所在之前优化代码称为“过早优化”。Donald Knuth 经常被引用以下引用,但他声称他偷走了其他人的引用:

过早优化是万恶之源。

在谈论维护代码库时,Donald Knuth 的更全面引用是:

我们应该忘记小的效率,大约 97%的时间说:**过早的优化是所有邪恶的根源。**然而,我们不应该放弃那个至关重要的 3%的机会。

换句话说,他说大多数时候,你需要忘记优化你的代码。它几乎总是足够好。在不够好的情况下,我们通常只需触摸 3%的代码路径。如果你的端点使用 if 语句而不是函数,那么你的端点速度要快几秒,就不会赢得任何奖品。仅在测量后进行优化。

过早优化包括调用某些_更快的_方法,甚至使用特定的数据结构,因为它通常更快。计算机科学认为,如果一种方法或算法具有与另一种方法或算法相同的渐近增长(或 Big-O),那么它们是等价的,即使在实践中速度是 2 倍。计算机如此之快,以至于算法作为数据/使用的计算增长比实际速度本身更重要。换句话说,如果你有两个_O(log n)_函数,但是一个是慢两倍,那真的不重要。随着数据量的增加,它们都以相同的速度“减速”。这就是为什么过早优化是万恶之源;这浪费了我们的时间,而且几乎从来没有真正帮助我们的总体表现。

就 Big-O 而言,你可以说所有语言都是你的程序的_O(n)_,其中 n 是代码行或指令。对于相同的指令,它们都以相同的速率增长。无论语言/运行时有多慢,在渐近增长方面,所有语言都是平等的。根据这个逻辑,你可以说为你的应用选择一种语言只是因为它的“快速”是过早优化的最终形式。你在没有测量的情况下选择一些所谓的快速的东西,而不了解瓶颈的位置。

为您的应用选择一种语言只是因为它的“快速”是过早优化的最终形式。


优化 Python

关于 Python 我最喜欢的一件事是它可以让你一次优化代码。假设你有一个 Python 方法,你发现它是你的瓶颈。你已经多次对它进行了优化,可能会遵循这里那里的一些指导,现在你已经非常确定 Python 本身就是瓶颈。Python 能够调用 C 代码,这意味着您可以在 C 中重写这一个方法以减少性能问题。您可以一次执行此方法。此过程允许您以编译为 C 兼容汇编程序的任何语言编写优化的瓶颈方法。这允许您在大多数时间保持 Python,并且只在您真正需要时才进入较低级别的事情。

有一种名为 Cython 的语言是 Python 的超级集合。它几乎是 Python 和 C 的合并,是一种渐进式的语言。任何 Python 代码都是有效的 Cython 代码,Cython 编译为 C 代码。使用 Cython,您可以编写模块或方法,并慢慢地进展到越来越多的 C 类型和性能。您可以将 C 类型和 Python 的 duck 类型混合在一起。使用 Cython,您可以获得仅在瓶颈上优化的完美组合,以及其他地方的 Python 之美。

Eve 在线的截图:用 Python 编写的太空 MMO

当你最终遇到性能问题的 Python 墙时,你不需要将整个代码库移动到另一种语言。只需在 Cython 中重写几个方法,几乎​​总能获得所需的性能。这是 Eve Online 采取的策略。Eve 是一款大型多人计算机游戏,它使用 Python 和 Cython 进行整个堆栈。他们通过优化 C / Cython 中的瓶颈来实现游戏级别的性能。如果它适用于他们,它应该适用于大多数人。或者,还有其他方法来优化您的 python。例如,PyPy 是 Python 的 JIT 实现,只需通过使用 PyPy 交换 CPython(默认实现),就可以为长时间运行的应用程序(例如 Web 服务器)提供显着的运行时改进。

让我们回顾一些要点:

  • 优化您最昂贵的资源。那是,而不是电脑。
  • 选择可以帮助您快速开发的语言/框架/体系结构(例如 Python)。不要仅仅因为技术快速而选择技术。
  • 遇到性能问题时:找到瓶颈
  • 您的瓶颈很可能不是 CPU 或 Python 本身。
  • 如果 Python 你的瓶颈(你已经优化了算法/等),那么将热点移到 Cython / C
  • 回去享受快速完成任务

我希望你喜欢阅读这篇文章,就像我喜欢写这篇文章一样。如果您想说谢谢,只需按下拍击按钮,或按住它。另外,如果你想在某个时候跟我谈论 Python,你可以在 twitter(@nhumrich)上打我,或者我可以在 Python 松弛频道上找到它。

[

](http://bit.ly/HackernoonFB)

[

](https://goo.gl/k7XYbx)

[

](https://goo.gl/4ofytp)

Hacker Noon 是黑客开始下午的方式。我们是 @AMI 家族的一员。我们现在接受提交的内容,并乐于讨论广告和赞助机会。

如果您喜欢这个故事,我们建议您阅读我们最新的科技故事趋势科技故事。直到下一次,不要把世界的现实视为理所当然!

  • 翻译
    57 引用 • 83 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...