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

学了这么久,你知道Python是如何运作的吗?

学了,这么,久,你,知道,python,是

云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

image

作为一名机器学习工程师,我使用Python已经一年多了。

最近出于兴趣,我也开始学习C ++。接触C++后,才意识到Python是多么容易和直观。我对Python与其他语言的不同之处及其工作机制愈加好奇。于是,本文诞生。

本篇文章将尝试讨论Python的内部工作机制。

image

Python最初是Guido Van Rossum在业余时开发的一个项目,于1991年首次发布。作为一门通用语言,Python为Netflix和Instagram等许多公司提供了强大支持。在一次采访中,Guido将Python与Java/Swift等语言进行了比较,他表示Java/Swift对于日常工作即是编程的软件开发人员是一个不错的选择,而Python针对的目标用户是日常工作与软件开发无关的人,他们编写代码主要是为了处理数据。

在阅读有关Python的文章时,经常会遇到诸如“编译型vs解释型”、“字节码vs机器码”、“动态类型vs静态类型”、“垃圾回收站”等词语。维基百科将Python描述为:

Python是一种解释型的高级通用性编程语言,具有动态类型和垃圾回收功能。

解释型语言

用C / C ++编写程序时,必须进行编译。编译是将人类可理解的代码转换为机器可理解的代码即“机器代码”。机器代码是CPU可直接执行指令的基本形式。成功编译后,代码生成一个可执行文件。执行此文件,代码中的操作将逐步运行。

尽管也需要编译这一步骤,但在大多数情况下,Python是一种解释型语言,而非编译型语言。首先将以.py文件编写的Python代码编译为字节码(后文将详细讨论),然后以.pyc或.pyo格式存储。

Python将源代码转换为字节码,而不像C ++等转换为机器代码。该字节码是可由解释器执行的低级指令集。Python解释器在大多数PC中安装在/usr/local/bin/python3.8路径下。字节码指令在虚拟机而非CPU上执行。

为什么选择解释型语言?

解释型语言具有独立于平台的一大优势。只要Python字节码和虚拟机版本相同,Python字节码就可以在任何平台(Windows,MacOS等)上执行。

Python的另一个优点是动态类型。在C ++等静态类型语言中,必须先声明变量类型,并在编译时检查所有差异(如添加字符串和整数)。但在像Python这样的强类型语言中,检查变量类型和所执行操作的有效性由解释器来完成。

解释型语言的缺点

动态类型提供给代码很大的自由度,但同时提高了代码的风险性,有时会难以调试。

Python经常被指责“速度慢”。这种说法是相对的,也存在很多争议,但之所以“慢”是因为解释器需要做额外工作来将字节码指令转换成可以在机器上执行的指令形式。StackOverflow上的一个帖子对此的解释更易理解:

如果你能用自己的母语和别人交谈,那通常要比口译员把你的语言翻译成其他语言让对方理解要快得多。

image

垃圾回收究竟是什么?

在早期编程语言中,内存分配主要依靠手动操作。很多时候,当变量不再使用或在程序的其他地方引用时,需要手动从内存中清除。垃圾回收站代替人工进行此项工作,无需任何操作即可自动释放空间。内存管理有两种方式:

简化方式是跟踪某对象的引用次数。当该数字下降到0时,删除该对象。这种方式被称为“引用计数”。在Python中无法禁用此功能。

在对象引用自身或两个对象相互引用的情况下,“生成垃圾回收”线程可以发挥作用。这是传统的引用计数所无法解决的。

什么是__pycache__?

在个人项目中或GitHub上,可能经常看到名为__pycache__的文件夹被自动创建。

/文件夹-_pycache_-preprocess.cpython-36.pyc-preprocess.py

如您所见,自动创建的文件名与文件夹外部的文件名相同,均为_pycache_。.pyc扩展名表示该文件包含preprocess.py的字节码。cpython表示解释器的类型。CPython意味着解释器是用C语言实现的。同样,JPython是用Java实现的Python解释器。

image

但为什么首先要创建文件夹?

因为这样可以稍微提高Python程序的速度。

而另一种提高速度的方式是更改Python代码,避免将其重新编译为字节码,从而节省时间。

云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

原文发布时间:2020-02-15
本文作者:读芯术
本文来自:“读芯术公众号”,了解相关信息可以关注“读芯术”


推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“的个人题解目录
    本文是2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“的个人题解目录。文章介绍了皮亚诺曲线的概念和特点,并提供了计算皮亚诺曲线上两点距离的方法。通过给定的两个点的坐标,可以计算出它们之间沿着皮亚诺曲线走的最短距离。本文还提供了个人题解的目录,供读者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • AndroidStudio 2.3迁移3.0踩坑之——Could not resolve project
    参见StackOverflow如果你的项目引用了自己的库,在迁移到3.0后,编译就会报错。Error:Failedtoresolve:Couldnotresolveproject: ... [详细]
author-avatar
just_roshinn5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有