当前位置: 首页 > 科技观察

Python真的是瓶颈吗?

时间:2023-03-12 09:37:47 科技观察

全面披露-我目前是一名Python工程师,所以你可以认为我有偏见。但我想反驳对Python的一些批评,并反思速度问题是否适用于使用Python进行数据工程、数据科学和分析的日常工作。Python太慢了吗?在我看来,应该根据特定的上下文或用例来询问此类问题。与C等编译语言相比,Python中的数字运算速度慢吗?是的。这个事实已经存在很多年了,这就是为什么Python库(例如numpy)在速度如此重要的地方充分利用了C。但是对于所有用例,Python是否都比其他(难以学习和使用)语言慢很多?如果您查看针对特定问题优化的许多Python库的性能基准,它们与编译语言相比表现良好。例如,看看FastAPI性能基准——很明显,作为一种编译语言,Go比Python快得多。尽管如此,FastAPI在构建RESTAPI方面击败了Go的一些库:>WebFrameworkBenchmarks—图片由作者提供旁注:上面的列表不包括具有更高性能的C++和JavaWeb框架。同样,当比较Dask(用Python编写)和Spark(用Scala编写)用于数据密集型神经影像管道[2]时,作者得出结论:性能没有实质性差异。我们应该问自己的问题是我们真正需要多少速度。如果您运行每天仅触发一次的ETL作业,则可能需要20秒或200秒,这无关紧要。那么您可能希望让您的代码易于理解、打包和维护,尤其是考虑到计算资源与昂贵的工程时间相比变得越来越便宜。代码速度和实用性从实用的角度来看,我们在为日常工作选择编程语言时需要回答许多不同的问题。(1)能否使用这种语言可靠地解决多个业务问题?如果您只关心速度,那么就不要使用Python。对于各种用例,有更快的替代方案。Python的主要优点是它的可读性、易用性以及它可以解决的许多问题。Python可以用作将无数不同系统、服务和用例结合在一起的粘合剂。(2)你能找到足够多的懂这种语言的员工吗?由于Python非常容易学习和使用,因此Python用户的数量不断增长。以前使用Excel处理数字的业务用户现在可以快速学习使用Pandas编写代码,从而学会自给自足,而不必总是依赖IT资源。同时,这也减轻了IT和分析部门的负担。它还可以缩短实现价值的时间。如今,对于了解Python并可以使用该语言维护Spark数据处理应用程序的人来说,比可以使用Java或Scala进行维护的数据工程师要容易得多。许多组织在许多用例中逐渐转向Python,仅仅是因为找到“会”这种语言的员工的机会更高。相比之下,我知道一些公司迫切需要Java或C#开发人员来维护他们现有的应用程序,但这些语言很难(需要数年才能精通)并且对新程序员似乎没有吸引力如果你的公司使用Python,业务用户,数据分析师、数据科学家、数据工程师、数据工程师、后端和Web开发人员、DevOps工程师,甚至系统管理员都可能使用同一种语言。这可以在项目中产生协同作用,让来自不同领域的人们一起工作并利用相同的工具。>图片来自StartupStockPhotos来自Pexels数据处理中真正的瓶颈是什么?从我自己的工作来看,我经常遇到的瓶颈不是语言本身,而是外部资源。更具体地说,让我们看几个例子。(1)写入关系数据库当以ETL方式处理数据时,我们需要最终将这些数据加载到某个集中位置。虽然我们可以利用Python中的多线程功能(通过使用更多线程)更快地将数据写入到某些关系数据库中,但是并行写入次数的增加可能会最大化该数据库的CPU容量。事实上,当我使用多线程加速写入AWS上的RDSAurora数据库时,我就遇到过这种情况。然后我注意到writer节点的CPU使用率上升到如此高的水平,以至于我不得不通过使用更少的线程来故意减慢代码以确保数据库实例不被破坏。这意味着Python对很多操作都有并行化和提速机制,但是关系型数据库(受限于CPU核数)有其局限性,不可能简单地使用更快的编程语言来解决。(2)使用外部RESTAPI调用外部API(您可能希望从中提取数据以满足数据分析需求)是语言本身似乎不是瓶颈的另一个例子。虽然我们可以利用并行来加速数据获取,但这可能是徒劳的,因为许多外部API限制了我们在特定时间段内可以发出的请求数量。因此,您可能经常发现自己故意放慢脚本速度以确保不超过API的请求限制:time.sleep(10)(3)处理大数据根据我处理海量数据集的经验,无论语言,都无法将真正的“大数据”加载到笔记本电脑的内存中。对于此类用例,您可能希望利用分布式处理框架,如Dask、Spark、Ray等。使用单个服务器实例或笔记本电脑时,可以处理的数据量是有限的。如果你想将实际的数据处理卸载到计算节点集群,甚至可能利用GPU实例来进一步加速你的计算,Python恰好有一个大型的框架生态系统来简化这个任务:DoyouwanttotakeadvantageGPU加速?数据科学的计算速度?使用Pytorch、Tensorflow、Ray或Rapids(甚至使用SQL—BlazingSQL)您想加速处理大数据的Python代码吗?使用Spark(或Databricks)、Dask或Prefect(可以集成DaskAbstraction)您想加速数据处理以进行分析吗?借助快速专用的内存列式数据库,只需使用SQL查询即可确保高速处理。而且,如果您需要协调和监控计算节点集群上发生的数据处理,可以使用多种用Python编写的工作流管理平台来加速开发和改进数据管道的维护,例如ApacheAirflow、Prefect或Dagster。如果您想了解更多有关这些的信息,请查看我以前的文章。顺便说一句,我可以想象有些人抱怨Python没有使用它的全部功能,或者可能没有使用正确的数据结构来解决手头的问题。总而言之,如果您需要快速处理大量数据,您可能需要比更快的编程语言更多的计算资源,而Python库允许您轻松地将工作分布在数百个节点上。结论在本文中,我们讨论了Python是否是当前数据处理领域的真正瓶颈。尽管Python比许多编译语言慢,但它易于使用且用途广泛。我们注意到,对于许多人来说,语言的实用性超过了速度方面的考虑。最后,我们讨论了至少在数据工程中,语言本身可能不是瓶颈,但无论选择何种编程语言,外部系统的限制和禁止在单台计算机上处??理的绝对数据量都是瓶颈。