AI 时代下组织如何快速变革?如何提升全员 AI 技能?戳> 了解详情
写点什么

Python 这么完美,但为什么反对者还是不放弃诋毁它?

  • 2021-08-13
  • 本文字数:2785 字

    阅读完需:约 9 分钟

Python这么完美,但为什么反对者还是不放弃诋毁它?

软件开发长期以来一直是一个雷区。


普通人会发现,用传统的编程语言(如 C 和 JAVA)闯入软件领域是很可怕的。


但一旦 Python 加入游戏,这种情况很快就改变了。Python 以其革命性的编程方法在软件开发方面是一个巨大的飞跃。


人们爱上 Python,是因为其简洁性、广泛的库支持和表达能力。因此,像 C 和 Java 这样的语言的统治结束了。

没有什么是完美的。等等,真的吗?

如果你是一个软件开发者,你可能熟悉**权衡(trade-off)**这个词。


每当一个关于编程语言的问题突然出现时,人们通常会得到一个传统的答案:“视情况而定”。


普遍认为没有一种完美的编程语言。等等, 是真的吗?


对我来说,不是这样。我认为 Python 是编程语言中的银弹。


到目前为止,我用过 Python、C、C++、MATLAB、JAVA。Python 是我接触最晚的,但却是最好的。


为了测试 Python,我做了一个实验,并将大多数非 Python 程序转换为 Python。最终的 Python 版本要好得多。


目前,据我所知,Python 在两个问题上一直受到严重批评:


  • 动态类型

  • 速度


虽然我同意这些问题在某种程度上对软件开发有重大影响,但我可以确认,这些大部分是 Python 诞生初期存在的问题。


然而,多亏了 rock-solid 社区,Python 已经演变到几乎与每一种编程语言相当。动态类型和速度不再对编码实践产生重大影响。


Python 可以用来处理任何问题。


如果是这样的话,为什么 Python 还没有被大规模采用呢?


因此,有必要解释为什么动态类型和性能问题是容易被忽略的小问题。

动态类型

为了理解动态类型,最好先理解其反面——静态类型。


静态类型语言有 C、JAVA 等。这些语言与它们的动态类型对应语言之间的主要区别在于类型检查。静态类型是在编译时进行类型检查,而动态类型是在运行时进行类型检查。


注:这是对动态类型和静态类型的平淡定义。其中具体的技术细节超出了本文要讨论的范畴。


由于 Python 的调试问题,以及 Python 语言如何使跟踪 bug 的过程变得比现在更复杂,一些开发人员对 Python 大发牢骚。


这种抱怨源于这样一个事实:作为一种动态类型语言,Python 在运行时标记错误,这使得它比 Java 等静态类型语言更容易出错。


理论上,这是一个威胁,毕竟考虑到一个著名的谚语——是人都会犯错。但是在实践中,我怀疑类型错误有没有他们声称的那样严重。


说真的,现在谁还犯类型错误?


静态类型语言远不是一个无障碍的调试避风港。除了类型错误之外,大多数静态类型语言都无法捕获到你可能认为应该检测到的细微错误。这些错误同样发生在静态类型和动态类型中。


此外,几乎没有代码会不经过单元测试就部署。单元测试可以很好地防范类型错误。只有极少数情况下,类型错误会绕过单元测试来搞乱代码。在调试方面,编程语言的另一个特性是安全类型和不安全类型。允许用户重写系统类型的语言被认为具有不安全的类型——例如 C。虽然不安全的类型给了用户对类型的控制,但它的误用会导致程序任意崩溃。


大多数静态类型语言都是不安全的类型系统。然而,JAVA 是一种安全类型语言。Python 和我所知道的其它动态类型编程语言也是如此。


最后,我更愿意使用像 Python 这样方便和高级的语言编写一百万次代码,而不是陷入 JAVA 等语言的低级细节中。

速度

可怜的 Python 总是笑着接受性能批评。如果你是在一场编程语言辩论中,我几乎可以保证,一旦你开始赞美 Python,你就会受到性能打击。这是真的。嗯,在某种程度上。


对于原始或标准 Python 比 C 或 JAVA 慢这一事实,我不会争论。但正如我之前所说,有一个像 Python 一样勤奋和创新的社区,不要害怕。


Python 与其静态类型的竞争对手之间的性能差距在过去几年中急剧缩小。JIT 编译和并行计算方面的进步使 Python 赶上了它的竞争对手。


许多变通方法都是为了解决 Python 的性能问题而开发的。例如:


  • 将实现从CPython更改为PyPy可以显著提高执行速度。有时候,PyPy 甚至能超越 C。


注意:CPython 是你从Python.org下载的实现。


  • 抑制GIL使得 Python 能够并行执行序列,从而提高计算速度。

  • JIT 编译器Numba。只要把 Numba 装饰器放在你的函数上,就可以看着它以光速运行了。

  • 许多 Python 库(例如 Numpy 和 Scipy)是用 C/C++编写的。


如您所见,性能是一个反对 Python 的过时论据。有了这些解决方案,除了赞叹 Python 充满活力的社区之外,别无选择。


但是,为什么有些人仍然不喜欢 Python,而喜欢使用老式的 JAVA 之类的东西呢?

为什么不向 Python“投降”?

首先,这有一篇让我咯咯笑的 quora 帖子。



来源:Quora


显然,有些人没有也不会认真对待 Python。真有趣!


无论如何,我个人认为阻止 Python 大规模采用的是人们对待编程的心态。换句话说,问题不在于编程语言,而在于人。


你看,Python 的出现是为了让编程更容易,更重要的是,为了节省时间


你可能在想,“我用 JAVA 写代码,好好的。我为什么要用 Python?”好吧,你当然不需要,但是要知道,如果你投资 Python,你将能够充分发挥你的编码潜力,而不是陷入 JAVA 的低级混乱中。


Python 是开源的、干净的、对用户友好的。用一个好的文本编辑器,你甚至可以让你的代码比英文文本还漂亮。Python 并不期望有什么回报,只是一点儿欣赏。


Python 可能太好了。我个人认为是这样。


人们仍然使用 C 和 JAVA 的原因是一个古老的信念——努力工作是有回报的。我不会撒谎说这个信念是错误的。但是,我想表达的是“努力工作会有回报”只是放在了错误的属性上。相反,这句话应该放在 Python 上。


事实上,JAVA 和类似的语言是跳转到 Python 之前的一个很好的热身。他们会让你更成功地使用 Python。


此外,在死板的程序员眼中,向 Python 的转换并不是一个选项,例如,曾协助 C 启动,并从那时起就一直被困在 C 中。一个真正随着语言成长并在其起伏中支持它的开发人员不太可能放弃这门语言。


我敢肯定,这些值得尊敬的开发人员不会改变他们的想法,即使在极端情况下——例如,发布一种自己写代码的编程语言。


事实是,“适应”说起来容易做起来难。

最后的一些想法

软件开发是一个令人入胜的领域。它总是让你保持警觉。


因此,你应该随时准备好武器来反击任何对你最亲爱的编程语言的批评。否则,你就要看着它中弹。知识和经验是你的最好的武器。


编程曾经是一个非常困难的领域,但现在由于 Python 的出现,它对每一个人来说都是一个开放的世界。


“Python 可以教给孩子们” — Guido Van Rossum


我个人认为 Python 是一种完美的编程语言。Python 在可读性方面胜过所有编程语言。当然,一个糟糕的 Python 程序员会产出糟糕的代码。但是,我觉得那些糟糕的代码会比这些人用另一种语言编写同样的代码的糟糕程度好得多。


坦白地说,我从未遇到过 Python 与另一种编程语言相比黯然失色的情况。也许将来我会。如果我做了,我会重新忏悔。


如果 Python 不是开源的,人们会指责我为 Python 打广告。


参考


文章的灵感来源于《计算机的进步》一书和作者的经历。

作者介绍

Mohammed Ayar,科技爱好者。区块链倡导者。撰写编程、数据科学与加密货币相关的文章。


原文链接:


https://towardsdatascience.com/python-is-perfect-why-anti-python-developers-wont-give-up-326ae1a09e7f

2021-08-13 09:004756
用户头像
刘燕 InfoQ高级技术编辑

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

关注

评论 5 条评论

发布
用户头像
Python之父都不会这么想。。。可能因为这帮特别的粉丝,Guido都离开Python BDFL
2021-08-21 21:38
回复
用户头像
听君一席话,不如去看书
2021-08-16 15:44
回复
用户头像
国外也有为了骗回复率而挑起争论的啊。

普通人会发现,用传统的编程语言(如 C 和 JAVA)闯入软件领域是很可怕的。

2021-08-16 15:30
回复
用户头像
这种就是只讲一部分不讲重点,屁用没有
2021-08-15 10:58
回复
用户头像
最讨厌这种没有营养的文章
2021-08-13 09:53
回复
没有更多了
发现更多内容

如何使用 ArrayPool

newbe36524

C# Docker Kubernetes

从这两道题重新理解,JS的this、作用域、闭包、对象

loveX001

JavaScript

高级前端一面面试题集锦

loveX001

JavaScript

腾讯前端经典react面试题(附答案)

beifeng1996

React

Ubuntu18.04编译ZLMediakit支持webrtc

Geek_pwdeic

WebRTC

vue这些原理你都知道吗?(面试版)

bb_xiaxia1998

Vue

美团前端一面手写面试题

helloworld1024fd

JavaScript

React源码分析(二)渲染机制

goClient1992

React

React源码分析(三):useState,useReducer

goClient1992

React

【立哥】【每日一个小知识】企业家和管理者有什么区别?

Lee Chen

Teradata 落幕中国的三个变化:“国产平替”变褒义、重型方法论不如最佳实践、前后端数据服务贴合

B Impact

vue组件通信方式有哪些?

bb_xiaxia1998

Vue

架构训练营第10期模块7作业

Geek_4db2d5

【Java基础】Java对象创建的几种方式

No8g攻城狮

Java 后端 Java 分布式 Java 开发

那些高级前端是如何回答面试题的

loveX001

JavaScript

阿里前端经典react面试题集锦

beifeng1996

React

面试官让你说说react状态管理?

beifeng1996

React

社招前端经典vue面试题(附答案)

bb_xiaxia1998

Vue

能否手写vue3响应式原理-面试进阶

helloworld1024fd

JavaScript

React源码分析1-jsx转换及React.createElement

goClient1992

React

云计算未来 5 年发展方向大盘点

亚马逊云科技 (Amazon Web Services)

人工智能

2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号。

福大大架构师每日一题

golang 音视频 ffmpeg 流媒体 福大大

ElasticSearch _bulk 使用与实战:批量操作、查询、冲突(模拟电商下单/查询)

alexgaoyh

批量操作 Elastic Search 关联查询 _bulk retry_on_conflict

美团前端一面高频vue面试题整理

bb_xiaxia1998

Vue

手撕常见JS面试题

helloworld1024fd

JavaScript

【Ask100-3】 用ARR衡量SaaS企业发展,需要怎样的前提?

B Impact

[go]交叉编译

追赶者

Go go build 交叉编译

开源SPL助力JAVA处理公共数据文件(txt/csv/json/xml/xsl)

石臻臻的杂货铺

Java 开源

架构实战营-模块二作业

🐢先生

架构实战营

从输入URL到渲染的过程中到底发生了什么?

loveX001

JavaScript

社招前端必会手写面试题集锦

helloworld1024fd

JavaScript

Python这么完美,但为什么反对者还是不放弃诋毁它?_AI&大模型_Mohammed Ayar_InfoQ精选文章