热门标签 | 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


推荐阅读
  • 导读:在编程的世界里,语言纷繁多样,而大部分真正广泛流行的语言并不是那些学术界的产物,而是在通过自由发挥设计出来的。和那些 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
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社区 版权所有