8

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

 3 years ago
source link: https://new.qq.com/omn/20210104/20210104A05HKI00.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

选自towardsdatascience

作者 Anna Anisienia

机器之心编译

编辑: 陈萍、李亚洲

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

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

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

ZRz6FbY.png!mobile

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

THE END

转载请联系本公众号获得授权

投稿或寻求报道:[email protected]


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK