写点什么

为什么 Python 不是面向未来的编程语言?

  • 2021-06-23
  • 本文字数:2941 字

    阅读完需:约 10 分钟

为什么Python不是面向未来的编程语言?

缓慢的速度、运行时问题和移动应用开发困境“毁掉”了 Python 的未来


编程社区花了几十年的时间才接纳了 Python。但自 2010 年初以来它一直在蓬勃发展,热度终于比肩 C、C#、Java 和 JavaScript。


但这种趋势会持续到什么时候?什么时候 Python 会被其他语言取代,为什么?


Python 的消亡时间是很难预测的,所以我不会给出确切的时间点,而是会评估当下正在推动 Python 普及的优势有哪些,将来导致它没落的缺陷又会是哪些。

哪些优势造就了 Python 今天的流行局面


Python 的成功从 Stack Overflow趋势中就能管中窥豹。这个趋势数据统计了平台上帖子中的标签数量。鉴于 Stack Overflow 的巨大规模,这是编程语言流行度的一个很好的指标。



StackOverflow 上各种编程语言的标签数量快照。


R 在过去几年一直处于稳定状态,其他很多语言的热度则在稳步下滑,但 Python 的增长似乎势不可挡。约 14%的 Stack Overflow 问题都被标记为“python”,而且这个趋势还在上升。


这种现象的背后有几个因素。

Python 历史悠久


Python 从 90 年代就出现了。这不仅意味着它有足够的时间来成长,还让它获得了一个庞大的支持社区。


因此,如果你在使用 Python 编程时遇到任何问题,都有很大几率通过一次谷歌搜索来解决它。因为很可能有人遇到过你的问题,并为此写了一些有用的方案。

它对初学者友好


这不仅是因为它已经存在了几十年,让程序员有时间制作精彩的教程。更重要的是 Python 的语法非常易读。


首先,它不需要指定数据类型。你只需声明一个变量;Python 会从上下文中理解它是整数、浮点值、布尔值还是其他值。这对初学者来说是一个巨大的优势。如果你用 C++编过程,你就会知道仅仅因为一个浮点数换成一个整数就让程序无法编译是多么令人沮丧。


如果你对比过 Python 和 C++代码,就会知道 Python 是多么容易理解。尽管 C++在设计时就考虑到了可读性,但与 Python 代码相比,它读起来还是相当费劲的。

它的用途广泛

由于 Python 已经存在了很长时间,开发人员已经为众多用途都制作了对应的包。如今,你可以找到几乎适用于所有事物的包。


想要处理数字、向量和矩阵?NumPy 是你的好帮手。


想为技术和工程行业做计算吗?请用 SciPy。


想在数据操作和分析方面大展宏图吗?试试 Pandas 吧。


想入门人工智能吗?为什么不用 Scikit-Learn 呢。


无论你尝试管理哪种计算任务,都可能有一个 Python 包可用。这让 Python 始终处于技术的最前沿阵地,从过去几年机器学习领域 Python 使用率的激增就可见一斑。

Python 的缺陷,它们是否会动摇根本?


如前文所述,你可以想象 Python 将在未来很长一段时间内保持很高的热度。但与所有技术一样,Python 也有其弱点。我会一一分析其中那些最重要的缺陷,并评估这些缺陷是否致命。

速度


Python 很慢,真的非常慢。平均而言,使用 Python 完成一项任务所需的时间是使用其他任何语言的 2 到 10 倍。


这种情况是多种原因造成的。其中之一是 Python 是动态类型的 — 请记住,你不需要像在其他语言中那样指定数据类型。这意味着它需要使用大量内存,因为程序需要为它可能用到的每个变量保留足够的空间。大量的内存使用就意味着大量的计算时间。


另一个原因是 Python 一次只能执行一个任务。这是灵活数据类型的后果——Python 需要确保每个变量只有一种数据类型,而并行进程可能会在这里出问题。


相比之下,你的常用 Web 浏览器可以同时运行十几个不同的线程。此外还有其他一些因素。


但归根结底,这些速度问题都不是很关键。计算机和服务器变得如此便宜,所以速度再慢也只是亚秒级的差距。最终用户并不那么关心他们的应用程序是在 0.001 秒还是 0.01 秒内加载。

作用域


一开始,Python 是动态作用域的。这基本上意味着,要评估一个表达式时,编译器首先搜索当前块,然后依次搜索所有调用函数。


动态作用域的问题在于每个表达式都需要在每个可能的上下文中测试 — 这很乏味。这就是大多数现代编程语言都使用静态作用域的原因。


Python 尝试过渡到静态作用域,但搞砸了。一般来说,内部作用域 — 例如函数内的函数 — 能够看到和改变外部作用域。在 Python 中,内部作用域只能看到外部作用域,而不能改变它们。这会导致很多混乱。

Lambda


尽管 Python 相当灵活,但 Lambda 的用法却相当有限。Lambda 只能是 Python 中的表达式,不能是语句。


另一方面,变量声明和语句始终是语句。这意味着 Lambda 不能用于它们。


表达式和语句之间的这种区别相当随意,在其他语言中不会出现。



空格让代码更具可读性,但更难维护。

空格


在 Python 中,你可以使用空格和缩进来表示不同级别的代码。这让代码看起来更美观且易于理解。


其他语言(例如 C++)更多依赖大括号和分号。虽然这可能不够美观,对初学者不够友好,但它让代码更易维护。对于更大的项目来说这种方法更好。


Haskell 等较新的语言解决了这个问题:它们依赖空格,但为那些希望不使用空格的人提供了另一种语法。

移动开发


当我们见证软件产业的主流从桌面转向智能手机时,很明显我们需要强大的语言来构建移动软件。


但使用 Python 开发的移动应用并不多。这并不意味着它做不到 — 有一个名为 Kivy 的 Python 包就是做这个的。


可是 Python 并不是为移动而设计的。因此,即使开发人员可能用它为基本任务做出可接受的结果,但最好的办法还是使用一种为移动应用开发而创建的语言。一些广泛使用的移动编程框架有 ReactNative、Flutter、Iconic 和 Cordova。


需要明确的是,笔记本电脑和台式电脑应该会继续存在很多年。但由于移动端的流量早已超过桌面端,可以肯定地说,只学习 Python 并不足以成为一个经验丰富的全能开发者。

运行时错误


Python 脚本不是先编译然后执行。相反,它每次执行时都会编译,因此任何代码错误都会在运行时显现出来。这会导致性能下降、耗费更多时间且需要进行大量测试。


这对初学者来说非常有用,因为测试可以教会他们很多东西。但是对于经验丰富的开发人员来说,用 Python 调试一个复杂的程序会让他们出岔子。这种缺陷是在 Python 上设置时间戳的最大因素。

哪种语言可以在未来取代 Python?


Python 在编程语言市场上有一些新生的竞争对手:


  • Rust 提供了与 Python 相同的安全性—任何变量都不会被意外覆盖。但它通过所有权和借用的概念解决了性能问题。根据 StackOverflowInsights 的说法,它也是过去几年最受欢迎的编程语言之一。

  • Go 非常适合喜欢 Python 的初学者。而且它非常简单,代码维护起来更容易。有趣的一点:Go 开发人员是市场上收入最高的程序员之一。

  • Julia 是一种非常新的语言,可以与 Python 正面竞争。它填补了大规模技术计算的空白:通常,人们会使用 Python 或 Matlab,并用大规模计算必需的 C++库修补整个过程流程。现在,人们可以使用 Julia,然后就用不着同时使用两种语言了。


虽然市场上还有其他语言选项,但 Rust、Go 和 Julia 成功弥补了 Python 的缺陷。所有这些语言都在新兴的技术领域有着出色表现,尤其是在人工智能方面。虽然它们的市场份额仍然很小(正如 StackOverflow 标签数量所反映的那样),但它们的趋势很明显:一路向上。



StackOverflow 上各种编程语言的标签数量快照。


鉴于目前 Python 语言无处不在,这些新语言中的任何一种都肯定需要五年甚至整个十年的时间才能取代它。


赢家将是哪种语言,是 Rust、Go、Julia,还是未来出现的某种新语言 ,目前还很难说。


但考虑到 Python 架构中的基本性能问题,总会有某种语言占据一席之地。


原文链接:


https://thenextweb.com/news/why-python-not-programming-language-future-syndication

2021-06-23 14:007386
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 539.3 次阅读, 收获喜欢 1977 次。

关注

评论 3 条评论

发布
用户头像
因为未来有未来的语言,infoq 最近的文章质量又掉下来了,一天天的讨论什么是世界上最好的语言,真无聊。
2021-06-30 16:21
回复
用户头像
这种话题最容易蹭热度
2021-06-28 14:22
回复
用户头像
好文章,可以转载吗?
2021-06-24 21:06
回复
没有更多了
发现更多内容

坐实大数据资源调度框架之王,Yarn为何这么牛

华为云开发者联盟

大数据 hadoop mapreduce YARN 资源调度框架

读《Software Engineering at Google》(02)

术子米德

架构师成长笔记

“一只股票一张表”, TDengine 在青岛金融研究院量化分析场景中的应用

TDengine

数据库 tdengine 物联网

自己动手写Docker系列 -- 5.6实现删除容器

Go Docker 4月月更

如何使用参数化查询提高Cypher查询的性能

华为云开发者联盟

参数化 Cypher查询 华为云图引擎 GES 参数化查询

在线SVG在线编辑器

入门小站

工具

设计消息队列存储消息数据的 MySQL 表格

「架构实战营」

腾讯一面:你平时怎么排查并调优慢 SQL 的

老周聊架构

MySQL 4月月更

【PIMF】开源鸿蒙首款IDE低代码入门OpenHarmony应用开发

离北况归

低代码 OpenHarmony Openharmony啃论文俱乐部 OpenHarmony应用开发 可视化界面

健康码如何影响世界

王字 Wannz

小程序 微信 finclip 凡泰极客 健康码

Retool 是什么,怎么样? —— Retool 低代码工具测评

蒋川

低代码 低代码开发平台 retool

龙蜥社区成立DeepRec SIG,开源大规模稀疏模型深度学习引擎

OpenAnolis小助手

深度学习 开源 龙蜥社区 sig 稀疏模型

为什么要进行数字化转型

王字 Wannz

数字化生态 数字化转型 finclip 小程序容器

Linux驱动开发-编写RFID-RC522射频刷卡模块驱动

DS小龙哥

4月月更

如何做好复盘

Hockor

复盘

Python 中的鸭子类型和猴子补丁

AlwaysBeta

Python

react源码解析8.render阶段

buchila11

React

2022南京14届-智慧工地-博览会

InfoQ_caf7dbb9aa8a

云效 Projex是什么?Projex企业级高效研发项目管理平台

阿里云云效

阿里云 项目管理 研发 敏捷研发 项目协作

[Day12]-[动态规划]-零钱兑换

方勇(gopher)

LeetCode 数据结构和算法

jackson学习之七:常用Field注解

程序员欣宸

4月月更

生于彼,长于此:狗形机器人的中国情缘

脑极体

读《Software Engineering at Google》(01)

术子米德

架构师成长笔记

2022南京14届-人工智能-博览会

InfoQ_caf7dbb9aa8a

云图说丨不同区块链之间如何跨链交互?

华为云开发者联盟

区块链 跨链 可信 可信跨链服务 跨链交互

Apache ShenYu源码阅读系列-Divide插件

子夜2104

linux之chattr命令

入门小站

2022南京14届-物联网-博览会

InfoQ_caf7dbb9aa8a

Docker 实战教程之从入门到提高(二)

汪子熙

Docker 容器 虚拟化 docker image 4月月更

区块链一周热点回顾|虎符元宇宙建筑Hoo HQ已对外开放体验

区块链前沿News

虎符交易所

react源码解析7.Fiber架构

buchila11

React

为什么Python不是面向未来的编程语言?_AI&大模型_Rhea Moutafis_InfoQ精选文章