热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么有些高级开发人员不喜欢Python

为什么有些高级开发人员不喜欢Python,Go语言社区,Golang程序员人脉社


本文转载自公众号“读芯术”(ID:AI_Discovery)。

许多高级开发人员表示,他们发现使用动态类型的语言令人头疼。下面的响应收集了大部分拍手。



“对不起,什么?动态类型的语言比静态类型的语言容易出错吗?抱歉,但是不是我21年的软件开发生涯。”

—拉斯姆斯·舒尔茨(Rasmus Schultz)


遵循此答案,我决定汇总使高级开发人员避开动态键入语言的主要原因,并在此处列出这些理由以消除误解。

为了更好地解决此问题,由于Python的迅猛发展,我们将以Python作为动态类型语言的示例。

动态类型

在这种情况下键入与击键无关。这个词是从数据类型派生的。

在编程方面,许多类型的类(例如强类型和鸭子类型)都可以发挥作用。但是,我们将自己限制为最常见的几个:


  • 动态类型

  • 静态类型

动态类型是在运行时标记类型错误的情况。也就是说,也不必像Python,Ruby和Javascript那样显式声明数据类型。

与动态类型相反,静态类型是在编译期间报告类型错误和显式声明数据类型的报告。C,C ++和Java就是这种情况。

一般来说,关于Python和编程语言的有趣之处在于,它们的某些优点还是缺点。

动态类型设置为通过隐式数据类型声明删除一些代码行来简化编码过程。但是,此功能有很大的陷阱。

为了让您当场,请考虑以下Python代码示例:

  1. max_number = 12 
  2. my_list = [] 
  3. for i in range(1, 5): 
  4.     max_numbre = 2 * (max_number * i) 
  5.     my_list.append(max_number) 
  6.  
  7. print(my_list) 

输出:

  1. [12, 12, 12, 12] 

在上面的示例中,我们要对变量max_number执行计算并将结果存储在列表中。但是,我们可以看到这一切都没有发生,并且结果是错误的。这是因为在for循环中,我们拼错了max_number,导致创建了另一个名为max_numbre的变量。

任何人都可能犯此类错误,尤其是在工作压力很大的人身上。

现在说您正在编写大量代码。您将需要更加注意下一步您的手指应点击哪些键。否则,跟踪代码中的错误可能会成为噩梦,从而导致可维护性问题。

但是,在像C ++这样的静态类型语言中,必须在使用前声明变量。而且您一定要进行执行前分析,以确保您的变量类型协调一致。由于可以更好地控制变量,因此最终可以提高安全性。

静态类型的重要性的一个例子是2009年与三名Twitter开发人员的对话,讨论了公司为何决定合并静态类型的语言Scala。

全局解释锁

高级开发人员会对性能感到惊讶的一件事是性能。

与初级人员不同,初级人员需要处理几行代码,维护和编写健壮的生产代码(通常为数百行或数千行代码),是由经验丰富的开发人员承担的。因此,拥有高效的编程语言可能会变得毫无疑问。

就是说,由于全局解释器锁(GIL)禁止充分利用计算机的资源,因此它是编程语言(如Python和MRI Ruby)的性能瓶颈。GIL损害的资源是CPU线程。

不过,不使用GIL的编程语言会充分利用CPU的功能。因此已知它们支持并行计算。

并行计算无非就是让所有线程同时运行。由于需要处理的天文数据数量众多,因此这种类型的计算现在比以往任何时候都更加重要。

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

为什么有些高级开发人员不喜欢Python

> Example of all CPU threads running. Diagram created by the author in diagram.net

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

但是,GIL的出现终结了并行计算。

GIL是一种锁,一次仅允许一个线程使用GIL。线程的选择遵循排队方式。这意味着,当具有最高优先级的线程正在使用GIL时,其他线程将处于等待状态,直到释放GIL。

最重要的是,用户无法控制线程选择。相反,操作系统是负责线程优先级排序的操作系统。

下图最好地说明了发生的方式:

为什么有些高级开发人员不喜欢Python

> GIL effects on the threads. Diagram created by the author in diagram.net

为了解决此问题,许多程序员,或者至少是聪明的程序员,尝试使用例如Python的多线程模块在线程之间手动拆分进程,以期获得更好的性能。他们最终最终会获得更差的性能。

尽管结果似乎很奇怪,但它是计算机科学,而不是计算机推测。如果您对问题进行更深入的研究,那么一切都应该放到位。

尽管Python的核心开发团队完全意识到了这个问题,但很难摆脱GIL,因为它是Python许多细节的骨干,例如内存管理和C扩展(仅举几例)。

Python的正式作者Guido van Rossum表示,他对Python是否会支持并行计算并不充满信心,因为这最终是该语言的设计方式。

但是,诸如C ++之类的静态类型语言不受GIL的限制。这使得它们在比较中效率很高。

空格敏感性

使用一种会因空格错位和缺失而标记错误的编程语言,可能并不是每个人的功劳。这些空格是空格,制表符,换行,返回或换页。例如,与C不同,Python确实对空格敏感。

我们将通过以下C和Python代码之间的比较来证明这一点。

Python版本:

  1. i = 50 
  2. if i % 2 == 0: 
  3.     print("inside if statement")  print("i is even") 

输出:

  1. print("inside if statement") print("i is even") 
  2. SyntaxError: invalid syntax 

C版:

  1. #include<stdio.h>int main(void) 
  2. {int i = 50;if (i % 2 == 0) 
  3. {printf("inside if statementn");printf("i is evenn");}} 

输出:

  1. ~/ $ ./test1 
  2. inside if statement 
  3. i is even 

与抵制混乱的代码结构并最终得到正确输出的C版本不同,Python生成的语法错误最初是由语句放置错误引起的。因此,有人会说Python不如C ++或原始C健壮。

具有讽刺意味的是,尽管许多专业程序员认为空白敏感性很烦人,但许多Pythonista人士认为处理空白问题比最后进行列追逐要好。

最后,在处理大型代码块时,空格敏感性问题令人讨厌。但是,如果在团队中灌输良好的编码习惯,则可以轻松解决空白敏感性问题。

向后兼容

不支持向后兼容性意味着旧版本的Python代码在新版本下可能无法工作。换句话说,绝对需要查找新版本中发生的语法更改,并相应地重写其代码。

当向后兼容性成为一个严重问题时,一个很好的例子是第一次从Python 2过渡到3。

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

Python的作者本人在讲话时承认了这一点:




“我们低估了多少人已经编写了大量的Python代码,然后基本上忘记了它是如何工作的。因此,他们不是很擅长升级它。我们意识到那里存在问题。”


关于该问题的裁决是延长了Python 2.7的寿命。

总结

编程语言一直是热门话题,因此不能将其视为对与错。至少有一些原因使他们偏爱另一种语言。

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



“学习使用Python编程比学习使用Java或Swift编程容易得多。对于学习计算机科学的专业软件开发人员来说,Java和Swift是很棒的编程语言。然后开始为一家软件开发公司工作。但是Python可以教给初中的孩子。”

除此之外,最理想的情况是拥有一种可以结合C ++和Python优点的编程语言。

原文链接:

https://medium.com/better-programming/why-some-senior-developers-dont-like-python-974c5361fff2


【责任编辑:赵宁宁 TEL:(010)68476606】


点赞 0


推荐阅读
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 基于OpenCV的小型图像检索系统开发指南
    本文详细介绍了如何利用OpenCV构建一个高效的小型图像检索系统,涵盖从图像特征提取、视觉词汇表构建到图像数据库创建及在线检索的全过程。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • 本文详细介绍了如何利用 Python 语言从文本文件中读取数据,并将其存储为字典格式,涵盖多种实用技巧和示例代码。 ... [详细]
  • 本文详细介绍了Python中常用的内置函数,包括但不限于数据操作、类型转换、数学运算及进制转换等,旨在帮助开发者更好地理解和运用这些功能强大的工具。 ... [详细]
  • A1166 峰会区域安排问题(25分)PAT甲级 C++满分解析【图论】
    峰会是指国家元首或政府首脑之间的会议。合理安排峰会的休息区是一项复杂的工作,理想的情况是邀请的每位领导人都是彼此的直接朋友。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • Python 中 filter、map 和 reduce 函数详解
    本文深入探讨了 Python 编程语言中 filter、map 和 reduce 函数的功能与用法,包括它们的基本语法、应用场景及代码示例,旨在帮助读者更好地理解和运用这些高阶函数。 ... [详细]
  • 本教程旨在指导开发者如何在Android应用中通过ViewPager组件实现图片轮播功能,适用于初学者和有一定经验的开发者,帮助提升应用的视觉吸引力。 ... [详细]
  • IEC60825激光产品安全标准详解
    随着激光技术在全球范围内的广泛应用,尤其是激光投影显示技术的兴起,了解和遵守相关的安全标准变得尤为重要。本文将详细介绍IEC60825激光产品安全标准及其重要性。 ... [详细]
author-avatar
手机用户2502870457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有