开工福利|免费学 2200+ 精品线上课,企业成员人人可得! 了解详情
写点什么

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

发布了 1112 篇内容, 共 547.5 次阅读, 收获喜欢 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
回复
没有更多了
发现更多内容

读《Software Engineering at Google》(15)

术子米德

架构师成长笔记

程序员如何快速开发高质量的代码?

利志分享

Scrum Patterns之理解各种团队模式

Bruce Talk

Scrum 敏捷开发 Agile Scrum Patterns

手撕《Google SRE Book》

一席

瑞萨IDE:CS+ for CC下载、安装和基础使用

不脱发的程序猿

ide 瑞萨 汽车级MCU CS+ for CC

修改,编译,GDB调试openjdk8源码(docker环境下)

程序员欣宸

Java JVM 4月月更

DaaS大数据服务简析

穿过生命散发芬芳

4月月更

自己动手写Docker系列 -- 6.3 手动配置容器网络(下)

Go Docker 4月月更

轻量化项目管理思路

秋去冬来春未远

需求管理 问题管理 问题和需求区别

瑞萨IDE:CS+ for CC进行BootLoader升级时开发环境配置

不脱发的程序猿

嵌入式 汽车电子 MCU 瑞萨 CS+ for CC

Robot OS添加开机启动服务

轻口味

android 4月月更 AOSP

Go 语言入门很简单:时间包

宇宙之一粟

时间 Go 语言 4月月更

OpenHarmony开源开发者成长计划,寻找改变世界的开源新生力!

科技汇

网络协议之:sctp流控制传输协议

程序那些事

Java Netty 程序那些事 4月月更

在线时序流程图制作工具

入门小站

工具

什么是区块链数字藏品,它具有什么价值?

CECBC

14岁懂社会-《给想要成为医生的你》读书笔记

懒时小窝

读书笔记 读书

一文搞懂SPI通信协议

不脱发的程序猿

spi 嵌入式 通信协议

「面向信仰编程」Draven 专访:像写代码一样,用树形的结构写文章

Shopee技术团队

Go 语言 技术播客

正确的文档排版方式

源字节1号

linux之pkill命令

入门小站

LabVIEW修改应用程序窗口外观

不脱发的程序猿

LabVIEW 修改应用程序窗口外观

LabVIEW显示控件中内容过长设置自动滚动条

不脱发的程序猿

LabVIEW 设置自动滚动条

瑞萨IDE:CS+ for CC新建工程配置方法

不脱发的程序猿

ide 汽车电子 CS+ for CC 瑞萨MCU

Java多线程归纳整理

高山觅流水

多线程

LabVIEW采集鼠标、键盘数据

不脱发的程序猿

LabVIEW 获取鼠标、键盘输入数据

redis优化系列(三)解决主从配置后的常见问题

乌龟哥哥

4月月更

如何发挥测试策略的指导性作用

KJ Meng

DevOps 研发管理 测试 自动化测试 测试策略

在线Excel转CSV工具

入门小站

工具

LabVIEW设置应用程序显示标签透明

不脱发的程序猿

LabVIVE 美化应用程序

云原生训练营毕业总结

hcyycb

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