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


推荐阅读
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
author-avatar
手机用户2502870457
这个家伙很懒,什么也没留下!
RankList | 热门文章