Anna Anisienia作者陈萍 李亚洲编译

为Python正名:语言本身不是瓶颈,可能是外部资源出了问题

Python 作为一种简单、易于掌握的编程语言,虽然在使用过程中存在短板,但也受到很多人的青睐。

Python 真的很慢吗?这需要具体问题具体分析。和 C 等编译型语言相比,Python 在处理数字方面速度确实很慢。这也从侧面说明了 Python 中加速数字处理的库(如 numpy)为什么如此重要了。

但是,Python 是不是在所有用例上都比其他编程语言慢呢?并非如此,如果了解一下为解决特定问题而优化的许多 Python 库的性能基准测试,你就会发现 Python 比编译型语言做得好。以 FastAPI 性能基准为例,FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。Go 语言显然比 Python 快,不过,FastAPI 在构建 REST API 方面胜过了 Go 的一些库:

Web 框架基准测试,不包括 C++ 和 Java web 框架。

同样,在比较 Dask(使用 Python 编写)与 Spark(使用 Scala 编写)处理数据密集型神经成像 pipeline 时,结果表明这两个引擎之间没有实质的性能差异。

代码速度 VS 实用性

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

问题 1:这种语言能够可靠地解决多项业务问题吗?

如果你只关心速度,那么不要用 Python,各种用例都有更快的替代方案。Python 的主要优点在于可读性、易用性和可解决大量问题。Python 可以作为粘合剂,将不同的系统、服务和用例连接在一起。

问题 2:你能找到足够多懂这门语言的员工吗?

Python 易于学习和使用,因此用户数量不断增长。以前使用 Excel 处理数字业务的用户,现在可以很快学会用 Pandas 编写代码,从而学会在不依赖 IT 资源的情况下实现自给自足。同时,这也缓解了 IT 和分析部门的负担。

如今,企业更容易找到会 Python、并能用这种语言维护 Spark 数据处理应用程序的数据工程师,而不是用 Java 或 Scala 做同样工作的人。许多组织在很多用例中逐渐转向使用 Python,因为懂 Python 的员工更容易找到。

相比之下,一些公司迫切需要 Java 或 C# 开发人员来维护他们现有的应用程序,但这些语言很难(需要数年才能掌握),而且对于新手程序员来说似乎没有吸引力,他们可能使用更简单的语言(如 Go 或 Python)在工作中挣到更多的钱。

问题 3:不同领域专家之间的协同效应

如果你的公司使用 Python,那么业务用户、数据分析师、数据科学家、数据工程师、后端和 web 开发人员、运维工程师甚至系统管理员很可能使用同一种语言。这将在项目中产生协同效应,来自不同领域的人可以一起工作并利用相同的工具。

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

在平时的工作中,通常我们遇到的瓶颈不是语言本身,而是外部资源。让我们看几个例子。

示例 1:写入关系型数据库

当以 ETL 方式处理数据时,最终我们需要将这些数据加载到某个集中的地方。虽然我们可以利用 Python 中的多线程,更快地将数据写入某些关系型数据库,但并行写入次数的增加可能会使该数据库的 CPU 容量达到极限。

这意味着 Python 具备并行化和加速操作的机制,但是关系型数据库(受 CPU 核数的限制)有其局限性,仅通过更快的编程语言很难解决。

示例 2:调用外部 API

另一个例子是使用外部 REST API,以提取数据来满足数据分析需求,这一案例中语言本身似乎并不是瓶颈。虽然我们可以利用并行加速来提取数据,但这可能是徒劳的,因为许多外部 API 限制了在特定时间段内发出请求的数量。因此,我们会故意让脚本变慢,以确保不会超过 API 的请求限制:

time.sleep(10)

示例 3:处理大数据

从处理超大数据集的经验来说,无论用什么语言你都不能直接用笔记本内存来负载大数据。这种情况下,你需要利用 Dask、Spark、Ray 等分布式处理框架。在使用单个服务器实例或者笔记本时,处理的数据量存在限制。

如果你想把实际的数据处理工作转移到一个计算节点集群中,甚至使用 GPU 来加速计算,Python 恰好有一个庞大的框架生态系统,使这个任务变得更容易:

  • 你是否想用 GPU 来加快数据科学的计算速度?使用 PyTorch、TensorFlow、Ray 或 Rapids(甚至 SQL - BlazingSQL)。
  • 你是否想加速 Python 代码处理大数据的速度?使用 Spark(或 Databricks)、Dask 或 Prefect。
  • 你是否想加快数据分析的处理速度?使用快速的专用内存列数据库,通过使用 SQL 查询确保高速处理。

此外,如果你需要协调、监测计算节点集群上发生的数据处理,你有 Apache Airflow、Prefect 或 Dagster 等多个 Python 工作流管理平台可供选择,它们可以加速数据 pipeline 的开发和维护。

顺带提一下,一些人可能会抱怨 Python 没有充分利用其能力或者未对手头问题使用合适的数据结构。

总而言之,如果你需要快速处理大量数据,那你更需要的是计算资源而不是快速的编程语言,而且一些 Python 库能够轻松实现在数百个节点上的分布式工作。

原文链接:https://towardsdatascience.com/is-python-really-a-bottleneck-786d063e2921

Powered by Froala Editor

工程Python数据处理
暂无评论
暂无评论~