Python简介
Python是什么
Python 是Guido van Rossum开发的一种动态类型、面向对象的脚本语言。
Python主要的垃圾回收算法是引用计数。但是Python中对象可以分为容器对象和非容器对象。其中容器对象又用到了标记清除算法。而容器对象中的子对象根据存活时间长短而使用分代回收的GC算法。
之后我们会介绍到关于Python如何生成对象,以及容器对象的相关细节和如何对对象进行垃圾回收等。
Python语言类型
编程语言主要从以下几个角度进行分类编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言。
- 编译器:把源程序的每一条语句都翻译程机器语言并保存为二进制文件,这样运行时可以直接用机器语言运行速度超级快。
代码--》编译器--》机器能读懂的代码--》运行
- 解释器:只有在程序运行时才一条一条解释成机器语言给计算机来执行,所以运行速度不是很快。
代码--》解释器-》字节码--》虚拟机边执行边翻译--》机器能读懂的代码--》运行
编译型 | 解释型 | 混合型 |
---|---|---|
C | JavaScript | Java |
C++ | Python | C# |
Go | Ruby | |
Swift | Php | |
Object-C | Perl | |
Pascal | Erlang |
编译型与解释型
编译器
优点:
编译器一般有预编译过程,对代码进行优化。因为运行前只编译一次,以后不许要编译。所以编译型语言运行效率高,不依赖环境(可以脱离环境独立运行)。
缺点:
编译后如果需要修改整个模块就需要重新编译。编译的时候根据不同环境生成的机器码,在不同机器之间移植时就会有问题。需要根据不同系统的环境去编译成不同的可执行文件。
解释器
优点:
有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护
缺点:
每次运行的时候都要解释一遍,性能上不如编译型语言。
动态语言和静态语言
动态语言
指运行期间才去做数据类型检查的语言,也就是说在用动态类型的编程语言时,永远也不用给任何变量指明数据类型,该语言会在第一次赋值时将数据类型记录下来。Python和Ruby就是典型的动态语言。
静态语言
在编译期间检查数据类型,也就是说在编写程序时需要指明数据类型例如c/c#/c++/java.
强类型定义语言和弱类型定义语言
强类型定义语言
强制数据类型定义的语言,也就是说如果一个数据类型被定义了,如果不经过强制转换,它就永远是这个数据类型。比如你定义了一个整型变量a,那么程序不能把a当做字符串处理。强类型定义是安全的类型。
弱类型定义语言
数据类型可以被忽略的语言。一个变量可以赋不同类型的值。强类型在赋值速度上不及弱类型,但逻辑上的安全性能避免很多错误。例如Python是动态解释的强类型语言。
Python的源代码(摘自垃圾回收的算法与实现)
各位看官可以去下载Python的源码看看
Python约有60万行源代码,大体分布如下。(Python3.0.1)
语言 | 源代码行数 |
---|---|
Python | 296215 |
C | 271109 |
汇编 | 9565 |
可以看出来,其中Python和c的行数几乎各占一半。实际上Python的库基本上使用Python写的,其核心部分是用C语言实现的。
目录结构如下
目录 | 概要 |
---|---|
Demo | Python的演示应用程序 |
Doc | 文档 |
Grammer | Python的语法文件 |
Include | 编译Python时引用的头文件 |
Lib | 标准附加库 |
Mac | mac用的工具等 |
Misc | gdbinit和vimrc等工具集合 |
Modules | Python对C语言模块的扩展 |
Objects | Python对象用的C语言代码 |
PC | 依存于OS等环境的程序 |
PCbuild | 构造Win34和x64时会用到 |
Parser | Python的解析器 |
Python | Python的核心 |
Python的优缺点
优点:
- Python的定位是明确、优雅、简单,所以Python代码看上去易懂。初学者容易学习,可以编写复杂的程序。
- 开发效率高,Python有非常丰富的第三方库,下载后直接调用,也可以进行二次开发,大大降低开发周期,避免重造轮子。
- 高级语言---当你用python编程时无需考虑底层如何实现的。
- 可以执行---Python是开源的,已经被移植到各种平台,python程序几乎不需要修改就能在各种平台上运行。
- 可扩展性---如果你希望某一段关键代码运行的更快又不希望其公开,那你可以使用c语言编写然后再Python上使用它们。
- 可嵌入性---把python嵌入到c/c++中,向你的程序提供脚本功能。
缺点:
- 速度慢(确实比c和java等都慢,但能满足大多数情况的需求。)
- 代码不能加密(解释型语言,源码明文存放的)
- 线程不能利用多cpu的问题---GIL全局解释锁,是计算机语言同步线程的工具,即任意一时刻只有一个线程在运行。Python的线程是操作系统的原生线程,在Linux上为pthread在windows上为Win thread,完全由操作系统调度线程的执行。一个解释器只有一条主线程,以及多条用户程序的执行线程。即使在多核平台上由于GIL的存在禁止多线程并行。
Python有哪些种类
- CPython
官方下载的版本。这个解释器是用C语言开发的所以称为CPython,是用的最广泛的Python解释器。一般说的Python就是指CPython。
- IPython
基于CPython的一个增强版本,执行Python代码的功能和CPython完全一样。
- PyPy
是另一种Python解释器,他的目标是速度。PyPy利用JIT技术,对Python代码进行编译,所以可以显著提高运行速度。
- Jython
运行在Java平台上的解释器,可以吧Python代码编译为java字节码执行。
- IronPython
与JPython类似,只不过是微软的.net平台。
Python的解释器有很多,如果要与java或者.net平台进行交互,推荐使用网络的方式。
对象管理
对象的结构
Python中将“列表”,“元组”等内置数据类型对应的结构体在内部进行定义。如下表示:
结构体名称 | 对应的内置数据类型 |
---|---|
PyListObject | 列表型 |
PyTupleObject | 元组型 |
PyDictObject | 字典型 |
PyFloatObject | 浮点型 |
PyLongObject | 长整型 |
我们来看看浮点型的结构体。
Include/floatobject.h
typedef struct {
PyObject_HEAD
double ob_fval;
} PyFloatObject;
可以看到其中定义了一个头和一个double类型的变量。我们知道Python使用的是引用计数。所以他不仅要保存对象的值,他还要去保存该对象的头信息(被引用 了多少次)。
我们来看一看PyObject_HEAD
Include/object.h
/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD PyObject ob_base;
之后我们找到了 PyObject这个结构体
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
好了,这个就是浮点型对象的头信息了。而其中ob_refcnt就是计数器,ob_type就是持有各种类型的信息。
其他对象也是一样的,他们也是这样来定义计数器的。有兴趣可以自己查看。
这样所有的内置型结构体都在开头保留了PyObject这个结构体。
这就是对象的结构。它是有两部分构成,可以理解为头和体,头就是PyObject这个结构体。体呢就是自己定义的,与他人不相同的部分了。
posted on 2018-12-18 16:43 Léon_The_Pro 阅读(161) 评论(0) 编辑 收藏 举报