请注意,这有点夸张。让我首先说明我专业从事python工作,我做出了许多开源贡献,并且我将python用于我所有的爱好项目。我喜欢蟒蛇。但它很慢。这是像Reddit这样的论坛上的一个常见话题,人们说你不能使用python,因为它很慢。是的,我们都知道python很慢。但我们也知道,通常不是语言让事情变慢,而是算法。是的,与C相比,python语言非常慢,但这并不是99%的时间python是慢的。Python很慢,因为很多(如果不是大多数的话)Python程序员不关心或理解他们所做的事情对整体性能的影响。您在编写Web应用程序时基本上可以这样做,但是如果您编写的库被数千、数十万甚至上百万人使用,它可能会对性能产生重大影响。让我们看一下Python运行缓慢的一些真实示例:此处显示的工具:pip是用于安装python库的工具virtualenv是用于创建封闭环境的工具,因此您不必全局安装所有包pytest是使用最广泛的测试libraries(可能标准库中的unittest用的比较多,但至少很接近)我选择这些工具是因为这是大多数人第一次接触python,这是我们专业人士每天接触的东西。>timepip--version0.34seconds>timevirtualenv-p(whichpython3)venv6.24seconds>timepytest#inanEMPTYdirectory0.32seconds>timepipinstallpytest#alreadyinstalled!!!0.85seconds这些测量值很常见,因为它们处于具有热缓存的新环境中(我测量过在具有冷磁盘缓存的virtualenv上15秒)。如果你的虚拟环境有很多依赖项,pipinstall(同样什么也不做)的时间会增加。很多。我在另一个项目中测量了2.1秒。算法是这里的问题,而不是python。我的意思是,当我们解决算法问题时,语言将成为问题,它永远不会比更快的语言更快,但我们在任何地方都差不多。我怎么强调都不为过:Python的基础工具链比它需要的要慢一个数量级。有时更多。导入(import)python中惯用的导入方式是个大问题。在python中使用sayrequests,您可以在文件顶部导入请求,大多数人会认为这是免费的或接近免费的。在python中它不是完全免费的,事实上它需要导入urllib2,这是缓慢的部分。所以人们认为请求的导入是免费的,请求的作者认为urllib2的导入是免费的。到处都是这样:成千上万的人认为进口是免费的。他们不是。我最常看到的一种模式是:try:importnumpyNUMPY_AVAILABLE=TrueexceptImportError:NUMPY_AVAILABLE=False并在导入时运行。我们什么时候在库中使用该标志?通常从不,而且numpy进口很昂贵。在我的机器上200毫秒。所以对于你的应用程序来说,它的启动性能非常好,因为它的功能在启动路径中没有用到,而且在很多情况下根本就没有用到。在开发时,这非常令人沮丧,因为您可以在整个工作日平均每分钟重新启动一次该过程。我很高兴一年前看到这一点,所以pytz在导入时停止解析其整个时区数据库。这比Django(可以说是最流行的Web框架)的启动节省了大约100毫秒。现在想想这个小小的改变将在10年内节省多少千瓦时。每次运行测试,每次启动webworker,在每个使用Django的站点上。这仅适用于Django!许多其他库和程序使用pytz。千篇论文之死的另一个问题是人们认为“哦,启动时只有10毫秒,这没什么大不了的”,但如果该启动每天进行数百万次,那将是一个实数。这对进口来说是正确的,但也适用于更多的东西。后续问题是人们在引入100次这样的减速后认为“再过10毫秒”。所以现在你只需将10毫秒加到1秒,或1%。没什么大不了的!所以现在你可以再增加10毫秒,略低于1%。每次你让它变慢,它就会变得更便宜(以百分比表示)让它变慢。请不要使用这种逻辑!上面的pipinstall示例是一个很好的案例研究。从磁盘加载字典并检查它是否包含字符串“pytest”将花费少于python的启动时间(~30毫秒)。但这不是pip正在做的,它在文件系统中运行,甚至加载python文件以获取它们的版本号(为什么?我没有问他们!为什么它们仍然没有以有效格式存储?)。我们在pytest中遇到了类似的问题,性能回归已经被引入了一千次,但现在一切都很慢,而且没有明显的方法可以摆脱这个问题。我贡献了一些补丁,但由于我在优化时所做的其他更改,我取得的大部分收益都被抹去了!最后,我放弃了提交补丁,自己构建了一个新的叫做hammett的测试运行器,它兼容pytest,但速度更快。我的意思是走得更快。我希望,如果有替代方案,人们可??以看到另一个可能运行缓慢的世界。我们如何使python更快?我们需要关心这一点。我们需要明白进口不是免费的。我们需要审视整个生态系统的基本组成部分,要么修复基本程序和库中的性能问题,要么替换它们。我们需要测量。一些开始的地方:pytest:使用hammett代替我,或敦促pytest的向后兼容性大大破坏,以提高性能pip:至少缓存一些结果!我应该能够运行“pipinstallbeforeexecutingeachcommand-rrequirements.txt”而不会注意到它避免做一些编写基准的工作:这可能是最简单的。例如,您可以将您的工具与其他语言的类似工具进行基准测试。我们至少应该知道我们是否比java慢一百倍。更新:事实证明,virtualenv的家伙已经在这上面了!版本20现在需要0.8秒来完成与之前6.4相同的操作。为此,virtualenv团队值得高度赞扬!原文网址:https://kodare.net/2020/05/19/python-is-slow-does-not-have-to-be.html
