作者 | Mohammed Ayar

译者 | 弯月

出品 | CSDN(ID:CSDNnews)

不少人认为 Python 方便掌握,而且不易出错。然而,并非所有人都同意这个观点。

许多高级开发表示,使用动态类型的语言实在很令人头疼:

“什么?动态类型的语言比静态类型的语言更加不容易出错?抱歉,21年的软件开发职业生涯告诉我并不是这样。”

—— Rasmus Schultz

在本文中,我们就来看一看高级开发人员不喜欢动态类型语言的主要原因,同时我也希望通过本文消除大家的误解。

为了更好地挖掘背后的原因,以及鉴于 Python 的广泛普及,我们以 Python 为例来分析一下。

动态类型 

这里所说的动态类型指的是数据类型。

编程语言包含多种类型的风格,比如强类型和鸭子类型等。但是,在本文中我们只讨论两个最常见的类型:

  • 动态类型

  • 静态类型

动态类型指的是在运行时检查类型错误。也就是说不需要显式声明数据类型。Python、Ruby 和 JavaScript 都是这类语言。

与动态类型相反,静态类型则会在编译期间报告类型错误,因此你需要显式声明数据类型。C、C++ 和 Java 就属于这种情况。

一般来说,Python 以及其他编程语言的某些优点也会成为缺点。

动态类型可以通过隐式的数据类型声明减少一部分代码,从而让编程变得更容易。但是,这个特性也有一些缺陷。

请考虑如下 Python 代码:

max_number = 12my_list = []for i in range(1, 5):  max_numbre = 2 * (max_number * i)  my_list.append(max_number)print(my_list)输出结果:[12, 12, 12, 12]

在这个例子中,我们希望针对变量 max_number 进行一些计算,并将结果存储在列表中。但是,我们可以看到实际的操作并不符合我们的预期,而结果也是错误的。因为在 for 循环中,max_number 的拼写有误,因此导致程序创建了另一个名为 max_numbre 的变量。

任何人都可能犯这样的错误,特别是对于工作压力很大的人。

假设你正在编写一大段代码,那么你必须更加小心手指按下的每一个按键。否则,查找代码中的bug就会成为噩梦,并引发维护性的问题。

然而,在静态类型的语言(比如C++)中,你必须在使用前声明变量。而且你必须在执行代码前进行分析,以确保变量类型匹配。这样你对变量的控制会更有力,因此可以提高安全性。

全局解释器锁

高级开发人员对动态类型语言的另一个质疑是性能。

初级开发人员只需要处理好几行代码,而维护和编写健壮的生产代码(几百行~几千行)的重任一般都由经验丰富的高级开发人员承担。因此,对他们来说,编程语言的效率不容置疑。

由于全局解释器锁(Global Interpreter Lock,即 GIL)的存在,计算机的资源(主要是 CPU 线程数)得不到充分利用,因此它是编程语言(如 Python 和 MRI Ruby 等)的性能瓶颈。

不过,不使用 GIL 的编程语言可以充分利用 CPU 的功能,因为它们支持并行计算。

并行计算只不过是让所有线程同时运行而已。在需要处理的数据量十分庞大时,这种类型的计算会比较有优势。

下图是一个并行计算的示例:

图:所有 CPU 一起运行的示例

我们可以假设,在相同的 CPU 时钟速度下,计算机拥有的线程越多,程序的运行速度就越快。

然而,GIL 的出现终结了并行计算。

GIL 的作用是保证一次只有一个线程使用 GIL。线程的选择遵循排队方式。这意味着,当拥有最高优先级的线程正在使用 GIL 时,其他线程将处于等待状态,直到 GIL 被释放。

最重要的是,用户无法控制线程的选择。只能由操作系统负责线程优先级的排序,如下图所示:

为了解决这个问题,许多程序员都尝试手动在多个线程之间拆分进程,比如 Python 的 multithreading 模块,就是为了获得更好的性能。然而,最终的结果却是性能更差了。

这个结果有点奇怪,如果你想搞清楚事情的始末,则必须再深入研究一下。

尽管 Python 的核心开发团队已经意识到了这个问题,但是想摆脱 GIL 太难了,因为它是许多 Python 功能的基础,例如内存管理和C扩展等等。

Python 的作者 Guido van Rossum 表示,他不确定 Python 是否会支持并行计算,因为这归根结底是语言设计层面的问题。

但是,C++ 等静态类型语言不受 GIL 的限制,因此它们的效率相对更高。

空白的敏感度

错误地使用空白就会报错,并不是每个人都喜欢这样的编程语言。空白不仅包括空格,还包括制表符、换行、返回或换页等。例如,与C不同,Python 对空格就非常敏感。

下面,我们就来比较一下 C 和 Python 代码。

Python 示例:

i = 50if i % 2 == 0:print("inside if statement")  print("i is even")输出结果:print("inside if statement")  print("i is even")                                  ^SyntaxError: invalid syntax

C 示例:

#include<stdio.h>int main(void){int i = 50;if (i % 2 == 0)输出结果:~/ $ ./test1inside if statementi is even

C 的代码结构无论再怎么混乱,都可以得到正确的输出,而 Python 生成的语法错误只是因为语句的书写位置有误。因此,有人可能会说 Python 的健壮性不如 C++ 或 C。

尽管许多专业程序员都认为空白过于敏感很讨人厌,但许多 Python 专家则认为,空白的问题总好过代码长得看不到尽头。

最后,在处理大块代码时,空白的敏感性问题确实很烦人。但是,如果能够向团队灌输良好的编码习惯,则这个问题也很好解决。

向后兼容

不支持向后兼容意味着旧版的 Python 代码无法在新版本中正常工作。换句话说,每当新版本发布时,你都需要找出语法的变化,并重写相应的部分代码。

有时,向后兼容性会成为一个严重的问题,Python 2 到 Python 3 就是一个很好的例子。

Python 核心开发团队认为,将 Python 2 的代码转换成 Python 3 不会有任何问题。但是他们错了。

Python 的作者也承认了这一点:

“我们低估了有多少人已经编写了大量的 Python 代码,而且他们已经基本忘记了代码的工作方式。因此,他们没能很好地升级这些代码。我们已经意识到了这个问题。”

这个问题争论到最后,他们决定延长 Python 2.7 的寿命。

总结

编程语言一直是一个热门话题,这不是一个非黑即白的两极分化问题。我们会因为某些原因而偏爱某一种编程语言。

通常,每种通用编程语言都有特定的适合人群。Python 的官方作者曾说:

“学习使用 Python 编程比学习使用 Java 或 Swift 要容易得多。Java 和 Swift 非常适合计算机科学的专业软件开发人员。但是 Python 更适合孩子的教学。”

话虽如此,我们非常希望能够出现一种兼具C++ 和 Python 优点的编程语言。

原文链接:https://betterprogramming.pub/why-some-senior-developers-dont-like-python-974c5361fff2

声明:本文由CSDN翻译,转载请注明来源。

你对机器学习的数学有哪些疑惑?欢迎在留言区写下你最想了解的问题,我们将在CSDN悦读时间直播间请大神为你答疑解惑,参与就有机会获得精美编程书一本哦!

☞特斯拉成了“特撕拉”,程序员成了背锅侠?你还会买吗?
☞腾讯高级研究员博士论文走红,称“计算机终于成了我一生的事业与希望”
☞19 岁华裔天才辍学创业,5 年市值达 73 亿美元
☞大厂竞业协议是“巨坑”?科大讯飞前员工、团队创始人跳槽腾讯被判赔 1200 万
☞库克考虑卸任苹果 CEO,谁会是下一任接班人?

点击阅读原文立即报名参加!

为什么有些高级开发不喜欢 Python?相关推荐

  1. 初级、中级和高级开发人员的差距在哪里?

    全文共2537字,预计学习时长5分钟 图片来源:Clem Onojeghuo Unsplash 你是初级.中级还是高级开发人员不仅仅由你的编程年龄决定.很多初级开发人员都比高级开发人员年长,归根到底还 ...

  2. 强烈推荐这11个Python开源项目,非常值得入门学习(从入门到Python高级开发)

    Python的日益普及及其在业界的使用使它成为当今最流行的编程语言之一.即使有很多学习Python的资源,例如参考书,视频教程,网站,您也可以将GitHub视为满足学习Python愿望的可靠资源之一. ...

  3. java安装_我最喜欢的Java高级开发人员书籍

    java安装 我上一篇博客文章(我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的 "面向高级Java开发人员的十大网站"的启发. Wang ...

  4. 高级java开发_我最喜欢的Java高级开发人员书籍

    高级java开发 我上一篇博客文章 (我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的"面向高级Java开发人员的十大网站"的启发. Wa ...

  5. 我最喜欢的Java高级开发人员书籍

    我上一篇博客文章 (我对高级Java开发人员的十个最喜欢的在线资源)的想法是由Xiaoran Wang发表的针对高级Java开发人员的十大网站的启发. Wang还写了一篇名为<面向Java高级开 ...

  6. 如何快速有效的学习 Python ?阿里高级开发工程师给出建议

    Python 的流行度屡创新高,作为大数据和人工智能时代的必备语言,Python 优点颇多,它语言简洁.开发效率高.可移植性强,经过多年的生态建设,Python 有了大量的函数库,尤其在数据分析和科学 ...

  7. 480集课程-打通Python开发的任督二脉 轻松掌握Python高级开发技术 Python超级学科课程

    480集课程-打通Python开发的任督二脉 轻松掌握Python高级开发技术 Python超级学科课程 ===============课程目录=============== ├─(1) 01-Pyt ...

  8. Python图形用户界面设计-Delphi For Python高级开发教程

    目录 简介........................................................................ 5 谁应该阅读这本教程........... ...

  9. 最新python全栈3期高级开发工程师 独家完整版

    课程目录: │   ├─1-10 │  │   │  ├─day01 │  │      01 python全栈s3 day1 计算机发展史.mp4 │  │      02 python全栈s3 d ...

最新文章

  1. 30行Python代码实现高分辨率图像导航
  2. Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)
  3. 当支持向量机遇上神经网络......
  4. PageRank算法--从原理到实现
  5. MATLAB之简谐信号声音的生成及其调制性
  6. 圆环自带动画进度条ColorfulRingProgressView
  7. Blocks与Dispatch Queue的使用
  8. svn 命令的使用(在linux下)
  9. 学科前沿技术专题第九章
  10. android苹果耳机音量调节,安卓线控耳机怎么调节音量大小?
  11. Java中对象的逃逸分析
  12. 用Python爬取网页数据,手把手教会你!
  13. 11.JVM-垃圾回收概述
  14. Android哪个系统占用内存小,哪个安卓模拟器占用的内存小,使用起来又不卡
  15. 什么是聚类以及四种聚类方法的比较
  16. Locating Elements
  17. python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜
  18. 高防IP适用于那些行业呢?
  19. 根据user-agent 区分浏览器
  20. 人脸图像识别(python人脸识别技术)

热门文章

  1. 「biáng biáng 面」马上可以打出来了!Unicode发布13.0版本,收录4939个生僻字
  2. 首批新冠肺炎人体疫苗来了!全球第一mRNA药物研发公司研制,已开启安全性临床试验...
  3. 达摩院浙大上海人工智能实验室推出洛犀平台:大小模型端云协同进化
  4. 20年研发管理经验谈(三)
  5. 不再重复造轮子,AI 给你推荐更好的代码,还没bug
  6. 李飞飞团队最新研究 :「四步」AI方案助老人抵抗新冠肺炎,联合学习降低个人隐私风险
  7. 「深入浅出」了解语音识别的技术原理和应用价值?
  8. SAP MM 明明有维护源清单,还是不能下PO?
  9. 这12大管理原则,经营者必知
  10. 智能人脸识别行业解决方案