python优化方法

Python的缺点就是运行特别慢,比其他语言慢2-10倍

原因:它是GIL(Global interpreter lock 全局解释器锁)===cpython,其他语言实现的Python可以没有如jpython,为解释型语言,为动态型语言

$\textcolor{red}{静态语言:}$数据类型需要先声明

$\textcolor{red}{动态语言:}$即语言无需声明数据类型直接可以使用的语言

Python写起来方便,简短的代价为执行速度

GIL:使得在同一进程内任何时刻仅有一个线程在执行(Cpython)

Python的解析器 ——
含有GIL的有:CPython、PyPy、Psyco;
没有GIL的有:JPython,IronPython。

multiprocessing库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷

方便将来$\textcolor{orange}{量化}$或者别的应用场景中的一些$\textcolor{green}{重计算的部分}$单独取出来,然后用Cython改写,独立成模块来提高运算速度

$\textcolor{red}{cpu密集型}$:也叫计算密集型,,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
$\textcolor{red}{io密集型}$:IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。
$\textcolor{red}{Cpython}$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1.cpython和ipython的区别:
CPython是用C语言编写的实现,CPython是使用字节码的解释器,CPython将您的Python代码编译为字节码
cpython就是我们下载完Python后通过命令行Python进入的解释器
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。

使用:
1.创建名为.pyx后缀的文件,文件内写符合C格式的代码(较难)
2.创建setup.py文件
3.python setup.py install 生成.c文件
4.进入cpython,import 模块
案例:Helloworld
1.创建一个文件helloworld.pyx,内容如下:
print('hello world!')
2.创建setup.py文件,内容如下
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("helloworld.pyx))
3.命令行进入到当前的位置,python setup.py install,生成文件
4.命令行使用Python进入cpython,import helloworld会自动输入helloworld
(通常为import fib fib.fib(10)的形式调用函数)
2.实现:Cython
一.注意:
1.Cython的扩展名为.pyx
2.引入模块cimport 模块名
3.@cython.boundscheck(False) 和 @cython.wraparound(False) 两个修饰符用来关闭 Cython 的边界检查
4.Cython的函数使用cdef定义
二.实现方法1
同上面的helloworld案例
三.实现方法2
1.创建名为.pyx的文件
2.不需要创建setup.py文件,直接在函数里导入
import pyximport
pyximport.install()
import 模块名
导入函数:模块名.函数名(参数)

$\textcolor{red}{Cython}$

1
2
3
1.在 Cython 中,类型标注对于提升速度是至关重要的
2.C语言在定义函数的时候,参数是要设定类型的,变量使用前需要定义类型
3.难点在代码转换,如何将Python形式的代码转换成C语言形式

$\textcolor{red}{速度快慢}$:纯Python版本<Python+c混合<C实现Python调用<纯c(C实现C调用)

https://www.jianshu.com/p/9410db8fbf50

$\textcolor{red}{Cython语句和表达式}$

1
2
3
4
5
6
7
8
1.Cython的语句和表达式遵循Python的语法
2.Cython里没有->操作符,用·替代;Cython里没有指针的取值操作符,用P[0]替代*p;Cython里取变量的地址操作符&;在Cython里空指针用Null表示,而且Null是保留关键字,不能用0表示
3.Cython里用<>进行强制转换,而非() eg: a = <int>b
4.Cython的for循环:
①同样支持Python的for in range
②处于性能考虑,Cython对for循环进行了优化,在循环前先定义变量
eg: cdef int i
for i in range(10)