AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

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

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

关注

评论 3 条评论

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

企业应用AI之路怎么走?飞桨实践有真知

百度大脑

AI 飞桨

当人工智能遇上视频直播——基于Agora Web SDK实现目标识别

dajyaretakuya

深度学习 音视频 WebRTC 声网 TensorFlow.js

Kubernetes 的自动伸缩你用对了吗?

张晓辉

Kubernetes k8s最佳实践

小白必看的,JS中循环语句大集合

华为云开发者联盟

JavaScript js 循环语句 while循环 for循环

理解Linux之文件I/O——知其然,知其所以然

奔着腾讯去

文件管理 Linux内核 文件I/O I/O模型

质量分析工具-监控大厅大揭秘

anyRTC开发者

音视频 WebRTC sdk

宜兴牵手百度智能云共建人工智能应用中心,推动数字经济创新发展

百度大脑

人工智能

Python——字符串转换与处理

在即

6月日更

聊聊追求测试技术导致过度测试

陈磊@Criss

如何进行可视化大屏视觉设计?

博文视点Broadview

【LeetCode】从上到下打印二叉树 Java题解

Albert

算法 LeetCode 6月日更

递归全排列问题(两种方法 Java实现)

若尘

数据结构 递归 6月日更

读深入ES6记[二]

蛋先生DX

ES6 6月日更

模块六作业

c

架构实战营

带你剖析鸿蒙轻内核任务栈的源代码

华为云开发者联盟

鸿蒙 任务栈 任务调度 任务上下文

Packer 自动化镜像 Windows 安装过程

HoneyMoose

☕️【Java技术之旅】站在Linux操作系统角度去看Thread(线程)

码界西柚

线程 Thread 6月日更 内核线程

那个陪我打王者的兄弟进了阿里

艾小仙

【Flutter 专题】109 图解自定义 ACERadio 单选框

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

Locust完成gRPC协议的性能测试

陈磊@Criss

春色满园关不住,带你体验阿里云 Knative

阿里巴巴云原生

云原生

想做DBA,多租户管理你一定要知道这些

华为云开发者联盟

多租户 GaussDB(DWS) 资源池 存储空间 资源隔离

构建高可用的MySQL

林一

MySQ MySQL 高可用 Maxscale

SpringBootApplication注解

梦倚栏杆

密码学系列之:生日攻击

程序那些事

加密解密 密码学 程序那些事

Java 并发编程——线程池开篇

Antway

6月日更

Webpack 系列:如何编写loader

范文杰

webpack 6月日更

证券互动问答平台关键词监控提醒

木头

互动平台 证券监控 股市消息 监控提醒

一文教会你认识Vuex状态机

华为云开发者联盟

Vue 应用 vuex 事件 父子组件

待办事项列表,敏捷项目管理的核心工件

万事ONES

Scrum 敏捷 研发管理 ONES

内嵌双向链表的设计与实现

实力程序员

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