【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

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

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

关注

评论 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
回复
没有更多了
发现更多内容

架构师训练营 0 期第二周

Blink

依赖倒置原则

Jeannette

Flink作业问题分析和调优实践

Apache Flink

大数据 flink 流计算 实时计算

极客大学架构师训练营 框架设计、设计原则、设计模式 第四课 听课总结

John(易筋)

极客时间 极客大学 极客大学架构师训练营 设计原则 框架设计

数仓系列 | 深入解读 Flink 资源管理机制

Apache Flink

大数据 flink 流计算 实时计算

红警1游戏开源,代码非常规范。网友:秀色可餐

程序员生活志

开源 红警1

20年行业变革与技术演进,当下CDN如何为政企数字化转型加速?

阿里云Edge Plus

CDN 边缘计算 移动视频

当你启动Redis的时候,Redis做了什么

老胡爱分享

redis 源码分析 面试

【大厂面试06期】谈一谈你对Redis持久化的理解?

NotFound9

数据库 redis 后端

设计模式的主要原则

第二周作业

Aldaron

依赖倒置架构

GAC·DU

课程总结

GAC·DU

架构师训练营第二章 总结

尔东雨田

如何构建低延时的直播体验,让互动更实时?

阿里云Edge Plus

CDN 短视频 直播 视频

面向开发者的 WSL2 安装指南

simpleapples

Python Windows 10 wsl Go 语言

Apache Flink 误用之痛

Apache Flink

大数据 flink 流计算 实时计算 数据处理

编程这件事

dapaul

第二周 作业

尔东雨田

【Week02】框架设计

Aldaron

从字符串到常量池,一文看懂String类设计

程序员DMZ

JVM 常量池 intern

使用WebMaker快速预览Ionic页面效果

davidce

Ionic WebMaker 混合应用开发

28岁程序员期权过亿,彪悍从字节退休,网友:酸了酸了!

程序员生活志

程序员 字节跳动 开发 退休

第二周作业

晨光

第二周总结

晨光

【架构】—回归本质(面向对象)

不二架构

面向对象 架构师 极客大学架构师训练营

看清远处模糊的事,不如做好身边清楚的事

Neco.W

创业心态 未知

免费下载 | 阿里云实时计算整体解决方案白皮书重磅发布!

Apache Flink

大数据 flink 流计算 实时计算

软件开发简史

Jeannette

小师妹学JVM之:JDK14中JVM的性能优化

程序那些事

JVM 小师妹 JIT JDK14 签约计划第二季

第二周总结

qqq

极客大学架构师训练营

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