Python真的是瓶颈吗?

时间:2022-11-15 10:11:55

全面披露-我目前是一名Python工程师,因此您可以认为我有偏见。但是我想揭露一些对Python的批评,并反思对于使用Python进行数据工程,数据科学和分析的日常工作,速度问题是否有效。

Python真的是瓶颈吗?

Python太慢了吗?

我认为,此类问题应基于特定的上下文或用例提出。与C之类的编译语言相比,Python的数字运算速度慢吗?是的。这个事实已经存在多年了,这就是为什么速度如此重要的Python库(例如numpy)在后台充分利用C的原因。

但是对于所有用例来说,Python是否比其他(难于学习和使用)语言慢很多?如果查看许多为解决特定问题而优化的Python库的性能基准,它们与编译语言相比表现良好。例如,看一下FastAPI性能基准测试-显然,Go作为一种编译语言比Python快得多。尽管如此,FastAPI还是击败了Go的一些用于构建REST API的库:

Python真的是瓶颈吗?

> Web Framework Benchmarks — image by the author

旁注:上面的列表不包括具有更高性能的C ++和Java Web框架。

类似地,当将Dask(用Python编写)与Spark(用Scala编写)比较用于数据密集型神经成像管道[2]时,作者得出以下结论:

总体而言,我们的结果表明,发动机之间的性能没有实质性差异。

我们应该问自己的问题是我们真正需要多少速度。如果您运行每天仅触发一次的ETL作业,则可能需要20秒钟还是200秒钟都不在乎。然后,您可能希望使代码易于理解,打包和维护,特别是考虑到与昂贵的工程时间相比,计算资源变得越来越负担得起。

代码速度与实用性

从务实的角度来看,在选择用于日常工作的编程语言时,我们需要回答许多不同的问题。

(1) 可以使用这种语言可靠地解决多个业务问题吗?

如果您只关心速度,那就不要使用Python。对于各种用例,都有更快的替代方法。Python的主要优点在于其可读性,易用性以及可以解决的许多问题。Python可以用作将无数不同的系统,服务和用例联系在一起的胶水。

(2) 能找到足够的懂这种语言的员工吗?

由于Python非常易于学习和使用,因此Python用户数量不断增长。以前曾在Excel中处理数字的业务用户现在可以快速学习在Pandas中进行编码,从而学会自给自足,而无需始终依赖IT资源。同时,这消除了IT和分析部门的负担。它还可以缩短实现价值的时间。

如今,与那些能够使用Java或Scala做到这一点的数据工程师相比,更加容易了解Python并且可以使用该语言维护Spark数据处理应用程序的人更加容易。许多组织只是因为找到"讲"该语言的员工的机会较高,而逐渐在许多用例上转向使用Python。

相比之下,我知道迫切需要Java或C#开发人员来维护其现有应用程序的公司,但是这些语言很困难(需要花费数年时间才能熟练使用),并且对于新程序员来说似乎没有吸引力,他们可能会在利用更简单的语言(例如,Go或Python。

来自不同领域的专家之间的协同作用

如果您的公司使用Python,则业务用户,数据分析师,数据科学家,数据工程师,数据工程师,后端和Web开发人员,DevOps工程师甚至系统管理员都很有可能使用相同的语言。这可以在项目中产生协同作用,使来自不同领域的人们可以一起工作并利用相同的工具。

Python真的是瓶颈吗?

> Photo by Startup Stock Photos from Pexels

数据处理的真正瓶颈是什么?

根据我自己的工作,我通常遇到的瓶颈不是语言本身,而是外部资源。更具体地说,让我们看几个例子。

(1) 写入关系数据库

在以ETL方式处理数据时,我们需要最终将此数据加载到某个集中位置。尽管我们可以利用Python中的多线程功能(通过使用更多线程)将数据更快地写入某些关系数据库中,但并行写入次数的增加可能会最大化该数据库的CPU容量。

实际上,当我使用多线程来加快对AWS上RDS Aurora数据库的写入速度时,这发生在我身上。然后,我注意到writer节点的CPU使用率上升到如此之高,以至于我不得不使用更少的线程来故意降低代码速度,以确保不会破坏数据库实例。

这意味着Python具有并行化和加速许多操作的机制,但是关系数据库(受CPU内核数量的限制)具有其局限性,仅通过使用更快的编程语言就不可能解决它。

(2) 调用外部API

使用外部REST API(您可能希望从中提取数据以满足数据分析需求)是另一个例子,其中语言本身似乎并不是瓶颈。尽管我们可以利用并行性来加快数据提取的速度,但这可能是徒劳的,因为许多外部API限制了我们可以在特定时间段内发出的请求数量。因此,您可能经常会发现自己故意降低了脚本运行速度,以确保不超出API的请求限制:

  1. time.sleep(10) 

(3) 处理大数据

根据我处理海量数据集的经验,无论使用哪种语言,都无法将真正的"大数据"加载到笔记本电脑的内存中。对于此类用例,您可能需要利用Dask,Spark,Ray等分布式处理框架。使用单个服务器实例或便携式计算机时,可以处理的数据量受到限制。

如果您想将实际的数据处理工作转移到一组计算节点上,甚至可能利用GPU实例来进一步加快计算速度,那么Python恰好具有一个庞大的框架生态系统,可简化此任务:

  • 您是否想利用GPU加快数据科学的计算速度?使用Pytorch,Tensorflow,Ray或Rapids(即使使用SQL — BlazingSQL)
  • 您是否想加快处理大数据的Python代码的速度?使用Spark(或Databricks),Dask或Prefect(可在后台将Dask抽象化)
  • 您是否想加快数据处理以进行分析?使用快速专用的内存中柱状数据库,仅通过使用SQL查询即可确保高速处理。

而且,如果您需要协调和监视在计算节点集群上发生的数据处理,则有几种用Python编写的工作流管理平台,这些平台可以加快开发并改善数据管道的维护,例如Apache Airflow,Prefect或Dagster。如果您想进一步了解这些内容,请查看我以前的文章。

顺便提一句,我可以想象有些抱怨Python的人没有充分利用它的能力,或者可能没有为眼前的问题使用适当的数据结构。

总而言之,如果您需要快速处理大量数据,则可能需要更多的计算资源而不是更快的编程语言,并且Python库使您可以轻松地在数百个节点之间分配工作。

结论

在本文中,我们讨论了Python是否是当前数据处理领域的真正瓶颈。尽管Python比许多编译语言要慢,但它易于使用且功能多样。我们注意到,对于许多人来说,语言的实用性超过了速度方面的考虑。

最后,我们讨论了至少在数据工程中,语言本身可能不是瓶颈,而是外部系统的局限性以及庞大的数据量,无论选择哪种编程语言,它都禁止在单个计算机上进行处理。

原文地址:https://www.toutiao.com/i6909527998911922702/