python解释器相关

1 语言相关

1.1 解释型和编译型语言的区别

  • 解释型语言:Python JavaScript PHP Shell MATLAB等
  • 编译型语言:C、C++、Goloang、Pascal(Delphi)、汇编等
1.1.1 解释型语言通用解释

通常不用对源代码进行编译,通过解释器一边执行一边转换,需要哪些源代码就转换哪些源代码,不生成可执行程序

这种编程语言称为解释型语言,使用的转换工具称为解释器

但是个解释型语言太过于以来解释器环境,而解释器本身就是一个虚拟环境,没运行代码前就申请内存、开辟空间启动解释器,这样其实过于消耗内存影响效率。

  • 特点:写代码的效率高,立竿见影看效果,调bug比较轻松,跨平台性好,但是执行效率不行
1.1.2 编译型语言通用解释

编译型语言写完后需要进行打包和编译,这会导致编写代码的过程见效慢,但是打包之后就省事了,以后都可以直接使用,也就是说编译后的使用方法非常方便,不像解释型语言,虽然写代码见效快,但是执行起来慢。

编译语言要求必须提前将所有的源代码一次性转换为二进制指令,生成一个可执行程序,比如像C这样的编程语言就是编译型语言,它所使用的工具称为编译器,也就是经常在linux下安装程序时需要的GCC或者G++

  • 特点:执行效率高,但是调bug真的很麻烦
1.1.3 二进制指令

二进制指令也就是机器码,是CPU能够识别的硬件层面的代码,简陋的硬件(古老的单机片)只能使用几十个指令,强大的硬件(PC、智能手机)能使用成百上千个指令

1.2 p2 和 p3 的区别

  • p2:print为语句,p3:print为方法
  • p2:默认为Ascii编码,P3:默认为Unicode(utf-8)
  • p2:除法结果为整数,p3:除法结果为浮点数
  • p2:默认四个字节表示一个字符,p3:默认二个字节表示一个字符
  • p2:map方法返回list,p3:map方法返回iteration

1.3 解释器的种类及特点

  • CPython:C语言开发的,是使用最广的解释器,具有GIL全局解释器锁
  • IPython:基于CPython的交互式解释器,功能与CPython无异
  • Jython:试运行在Java平台上的Python解释器,可以直接把Python的代码编译成Java字节执行,但CPython没有Jython的垃圾回收机制
  • IronPython:IronPython和Jython类似,只不过IronPython是运行在微软.NET平台上的Python解释器,可以直接把Python代码编译成.Net字节码
  • PyPy:另一个Python解释器,目标是执行效率采用JIT技术,对Python代码进行动态编译,提高执行效率

1.4 列举几个PEP8规范

1.4.1 RFC
  • 专门用来定义网路请求的标准文档,是一系列以编号排定的文件,文件收集了有关互联网相关信息
1.4.2 PEP8
  • 每一级缩进使用4个空格,每行最大字符限制为79个,除了长导包语句,和url地址
  • 导入通常在分开的行,不推荐同行导入多个模块
  • 不能使用单字符(1 I O)作为变量名
  • 类的首字母大写,函数的首字母小写

2 代码验证

2.1 切换盘符----命令行

C:>F:

2.2 不同解释器验证高并发

  • 使用全局解释器GIL的原因:高并发情况下,逻辑是没问题的,但是编辑器存在问题
num = 0

def change_it(n):
    global num
    for i in range(1000000):		# 人为构造高并发
        num -= n
        num += n
    print(num)

threads = [
    threading.Thread(target=change_it, args=(8,)),
    # 加()是调用,声明变量是不需要的,args里面是元祖类型,不写就是默认整形
    threading.Thread(target=change_it, args=(10,))
]

[t.start() for t in threads]
# 列推性能是普通for循环的7倍左右,因为在底层中,是不需要引用计数的
[t.join() for t in threads]
# 阻塞,所有线程结束,子线程才会结束
print(num)
# 对于pypy来说,可以解决高并发问题,性能远超于Cpython
# 高并发情况下,逻辑是没问题的,但是编辑器存在问题,要加GIL锁

2.3 不同解释器效果

2.3.1 Cpython 效果
f:monthForthDjangosNewdjango19django19>python test.py
2
-6
-6

f:monthForthDjangosNewdjango19django19>python test.py
0
0
0

f:monthForthDjangosNewdjango19django19>python test.py
-30
-30
-30
2.3.2 pypy3 效果
f:monthForthDjangosNewdjango19django19>python test.py
0
0
0

f:monthForthDjangosNewdjango19django19>python test.py
-30
-30
-30

f:monthForthDjangosNewdjango19django19>pypy3 test.py
10
10
10

f:monthForthDjangosNewdjango19django19>pypy3 test.py
0
0
0
原文地址:https://www.cnblogs.com/mapel1594184/p/14169397.html