本文转载自公众号“读芯术”(ID:AI_Discovery)。
我是一名Python工程师,所以你可以认为我有偏见。在本文中,我想澄清一些关于Python的批评,并探讨在使用Python进行数据工程、数据科学和分析学的日常工作中,我们是否有必要担忧速度。
Python速度很慢吗?
在我看来,这类问题应该基于特定的情境和用例提出。与编译语言(如C语言)相比,Python处理数字的速度慢吗?是的,慢。这是众所周知的事实,这就是为什么Python库在后台控制着C语言,而在诸如numpy的Python库中,速度起着重要作用。
但是对于所有用例来说,Python是否比其他(更难学习和使用的)语言慢得多?你若查看为解决特定问题而优化的许多Python库的性能基准,就会发现它们与编译语言相比,表现相当不错。
例如,看看FastAPI的性能基准——显然,Go作为一种编译语言要比Python快得多。尽管如此,FastAPI在构建REST API方面还是胜过了一些Go的库:
我们应该扪心自问的是,我真正需要的速度是多少。如果运行每天只触发一次的ETL作业,你可能并不关心它需要20秒还是200秒。你可能更倾向于使代码易于理解、封装和维护,特别是考虑到与昂贵的工程时间相比,计算资源正变得越来越便宜。
代码速度与实用性
图源:unsplash
从实用的角度来看,在为日常工作选择编程语言时,我们需要回答许多不同的问题。
(1) 你能用这种语言切实解决多个业务问题吗?
假如你只关心速度,那就别用Python了。各种用例都有更快的替代方案。Python的主要优点在于它的可读性、易用性,以及能用它解决广泛问题。Python可以用作桥梁,将无数不同的)系统、服务和用例连接在一起。
(2) 你能找到足够多的懂这门语言的员工吗?
Python非常容易学习和使用,所以其用户数量在不断增长。以前用Excel处理数字的商业用户,现在可以很快学会用Pandas编码,从而自给自足,无需始终依赖IT资源。同时,这消除了IT和分析部门的负担,也缩短了实现价值的时间。
近些年,比起那些能用Java或Scala做同样事情的人,你更容易找到那些了解Python并能用这种语言维护Spark数据处理应用程序的数据工程师。许多组织在很多用例中逐渐转向使用Python,只是因为找到“会说”这种语言的员工的几率更高。
我知道一些公司非常需要Java或C#开发人员来维护他们现有的应用程序,但这些语言很难(需要很多年才能掌握),而且对于新程序员来说似乎没有吸引力,因为他们可以用更简单的语言(如Go或Python)来获得更多收入。
(3) 不同领域专家之间的协同效应
假如你的公司使用Python,那么商业用户、数据分析师、数据科学家、数据工程师、后端和web开发人员、DevOps工程师,甚至系统管理员很可能都使用同一种语言。这会引起项目中的协同效应,来自不同领域的人可以一起工作。
数据处理中真正的瓶颈是什么?
在我的工作中,我通常遇到的瓶颈不是语言本身,而是外部资源,来看几个例子。
(1) 写入关系数据库
在以ETL方式处理数据时,最终需要将此数据加载到某个集中位置。尽管可以利用Python中的多线程功能,将数据更快地写入某些关系数据库中(通过使用更多线程),但并行写入操作次数的增加可能会使数据库的CPU容量使用最大化。
事实上,我在AWS上使用多线程加速RDS Aurora数据库的写入操作的时候,这种情况就发生过一次了。我注意到写入节点的CPU利用率非常高,以至于我不得不通过使用更少的线程来刻意降低代码的速度,以确保不会破坏数据库实例。
这意味着Python具有并行化并加快许多操作的机制,但关系数据库(受CPU核数量的限制)有其局限性,仅通过使用更快的编程语言不太可能解决这个问题。
(2) 调用外部的API
使用外部REST API,你可能是想从中提取数据来满足数据分析需求,这同样证明了语言本身似乎不是瓶颈。虽然我们可以通过利用并行性来加速数据提取,但这可能是徒劳的,因为外部API限制了我们在特定时间段内可以发出的请求数量。因此,你可能会刻意让脚本变慢,来确保不超出API的请求限制:
- time.sleep(10)
(3) 使用大数据
从我处理大量数据集的经验来看,无论使用哪种语言,都无法将真正的“大数据”加载到笔记本电脑的内存中。对于这样的用例,你可能需要利用分布式处理框架,如Dask、Spark、Ray等。在使用单个服务器实例或笔记本电脑时,可以处理的数据量是有限制的。
如果你想把实际的数据处理工作转移到一个计算节点集群中,可能使用GPU实例来进一步加快计算速度,Python刚好有一个庞大的框架生态系统,可以简化这项任务:
- 你想通过利用GPU来加快数据科学的计算速度吗?使用Pytorch、Tensorflow、Ray或Rapids吧。
- 你想加快处理大数据的Python代码的速度吗?使用Spark(或Databricks)、Dask或Prefect吧(可在后台将Dask抽象化)。
- 你想加快用以分析的数据处理速度吗?使用快速专用的内存列数据库,通过SQL查询确保高速处理。
如果你需要协调和监视在计算节点集群上发生的数据处理,有几个用Python编写的工作流管理平台,可以加快数据管道的开发和维护,例如Apache Airflow、Prefect或Dagster。
有些抱怨Python的人,其实并没有充分利用它,或者可能没有使用适当的数据结构来解决眼前的问题。总而言之,如果你需要快速处理大量数据,那你可能需要更多的计算资源,而不是更快的编程语言,而且有一些Python库可以轻松地将工作分布到数百个节点上。
图源:Google
虽然Python比许多编译语言慢,但它好用且非常多样化。对许多人来说,语言的实用性胜过速度方面的考量。语言本身可能不是瓶颈,至少在数据工程中是这样,瓶颈是外部系统和庞大数据量的限制,无论选择哪种编程语言都无法在单个计算机上进行处理。