速度or实用性:Python真的遇到瓶颈了吗?

开发 后端
在本文中,我想澄清一些关于Python的批评,并探讨在使用Python进行数据工程、数据科学和分析学的日常工作中,我们是否有必要担忧速度。

本文转载自公众号“读芯术”(ID:AI_Discovery)。

我是一名Python工程师,所以你可以认为我有偏见。在本文中,我想澄清一些关于Python的批评,并探讨在使用Python进行数据工程、数据科学和分析学的日常工作中,我们是否有必要担忧速度。

[[376425]]

Python速度很慢吗?

在我看来,这类问题应该基于特定的情境和用例提出。与编译语言(如C语言)相比,Python处理数字的速度慢吗?是的,慢。这是众所周知的事实,这就是为什么Python库在后台控制着C语言,而在诸如numpy的Python库中,速度起着重要作用。

但是对于所有用例来说,Python是否比其他(更难学习和使用的)语言慢得多?你若查看为解决特定问题而优化的许多Python库的性能基准,就会发现它们与编译语言相比,表现相当不错。

例如,看看FastAPI的性能基准——显然,Go作为一种编译语言要比Python快得多。尽管如此,FastAPI在构建REST API方面还是胜过了一些Go的库:

 

速度or实用性:Python真的遇到瓶颈了吗?

 

 

网络框架基准(上面的列表不包括C++和Java web框架,它们的性能甚至更高。)

 

我们应该扪心自问的是,我真正需要的速度是多少。如果运行每天只触发一次的ETL作业,你可能并不关心它需要20秒还是200秒。你可能更倾向于使代码易于理解、封装和维护,特别是考虑到与昂贵的工程时间相比,计算资源正变得越来越便宜。

代码速度与实用性

[[376426]]

图源: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的请求限制:

  1. 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库可以轻松地将工作分布到数百个节点上。

速度or实用性:Python真的遇到瓶颈了吗?

图源:Google

虽然Python比许多编译语言慢,但它好用且非常多样化。对许多人来说,语言的实用性胜过速度方面的考量。语言本身可能不是瓶颈,至少在数据工程中是这样,瓶颈是外部系统和庞大数据量的限制,无论选择哪种编程语言都无法在单个计算机上进行处理。

 

责任编辑:赵宁宁 来源: 读芯术
相关推荐

2010-01-08 12:11:04

ibmdwWeb

2016-12-16 09:37:33

Linux实用性 行动

2013-05-30 09:19:31

灾难恢复故障排查运维

2023-12-20 07:52:49

Python高级用法生成器

2011-05-31 18:41:45

复印机技巧

2011-11-02 17:30:36

HTML 5

2020-12-24 06:00:27

Python编程语言开发

2011-05-03 13:20:39

照片打印机

2017-08-12 13:36:15

虚拟化灾难恢复服务器

2024-02-04 00:00:00

Go货币接口

2023-11-28 15:19:00

Linux运维btop命令

2021-07-19 10:13:41

Figma插件工具

2022-08-09 07:08:28

函数式编程Go

2012-06-28 11:31:32

中晶扫描仪

2023-10-12 09:52:13

Bard聊天机器人

2018-06-13 15:28:26

笔记本触控功能

2018-03-12 13:48:35

安全软件威胁恶意软件

2021-05-11 17:38:11

5G4G网络

2017-11-14 19:17:00

CIO教育智慧校园

2010-04-22 17:36:51

Oracle数据库
点赞
收藏

51CTO技术栈公众号