写点什么

为什么 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:007374
用户头像
刘燕 InfoQ高级技术编辑

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

关注

评论 3 条评论

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

架构 2 期 - 第二周作业(1)

浮生一梦

极客大学架构师训练营 第二周作业 2组

第六周 技术选型(2)学习总结

蓝黑

极客大学架构师训练营

第六周 技术选型(2)作业

蓝黑

极客大学架构师训练营

架构师训练营第 1 期 - 第六周总结

Todd-Lee

架构师训练营 1 期 - 第六周总结(vaik)

行之

极客大学架构师训练营

Redis Cluster你弄明白了吗?

Man

分布式 中间件 redis cluster

极客时间架构师培训 1 期 - 第 6周作业

Kaven

第二周作业

晴空万里

架构 2 期 - 第二周作业(2)

浮生一梦

极客大学架构师训练营 第二周总结 2组

作业-框架设计

arcyao

架构师训练营第 1 期第六周作业

Leo乐

极客大学架构师训练营

第二周作业

CraspLion

架构师训练营第一期第六章作业-简述CAP理论

睡不着摇一摇

极客大学架构师训练营

架构师训练营作业2

Arthur

极客大学架构师训练营

第六周课后练习

天天向上

极客大学架构师训练营

架构师入门学习感悟二

笑春风

CAP原理

A p7+

架构师训练营第 1 期 - 第六周作业提交

Todd-Lee

极客大学架构师训练营

架构师训练营第 6 周学习总结

netspecial

极客大学架构师训练营

第六周作业

极客大学架构师训练营

第二周作业

孤星

架构师训练营第六周作业

吴传禹

极客大学架构师训练营

架构师训练营第六周命题作业

成长者

极客大学架构师训练营

架构师训练营第一期第六章总结

睡不着摇一摇

极客大学架构师训练营

架构师训练营 1 期 - 第六周作业(vaik)

行之

极客大学架构师训练营

CAP原理

架构师训练营第二周作业

Sandman

极客大学架构师训练营

芯片破壁者(十八):CPU战争三十年

脑极体

极客时间架构师训练营1期-第6周总结

Kaven

架構師訓練營 week6 總結

ilake

依赖倒置原则和优化设计相关

DL

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