GIL(全局解释器锁)
- GIL只应用于Cpython解释器,GIL是把互斥锁
- 由于Cpython无法应对多个线程同时对系统资源的请求,所以需要GIL对全局资源上锁,使得线程能交替(并发)使用全局资源
- GIL是解释器层面的,互斥锁是代码层面的,注意线程对全局变量的使用还是要加互斥锁
- GIL锁在线程执行完,线程阻塞,超时时自动释放,如不存在以上条件,则根据其计数器结束
- GIL影响:多线程交替并发执行,不能利用多核cpu。如想避免这些影响,可以使用多进程或者用c,c++写多线程函数再由python调用
python运算符问题
python中运算符计算实际上是解释器自动调用魔法方法,如__add__,__sub__
python整除,取余
赋值,浅拷贝,深拷贝
- 赋值是引用的传递,两个对象指向的同一片空间
-
浅拷贝
浅拷贝只拷贝目标顶级的引用,不会对结构层次进行拷贝,如下b浅拷贝只是把a[3]列表的引用进行的拷贝,当a[3]列表内容改变时,b也随之更改
import copy a=[1,2,3,[4,5]] b=copy.copy(a) a[3].append(3) # a=[1,2,3,[4,5,3]] # b=[1,2,3,[4,5,3]]
-
深拷贝
深拷贝相对于浅拷贝来说,深拷贝会对所有层次结构进行拷贝
import copy a=[1,2,3,[4,5]] b=copy.copy(a) a[3].append(3) # a=[1,2,3,[4,5,3]] # b=[1,2,3,[4,5]]
-
分片属于浅拷贝
-
copy.copy对于可变类型,会进行浅拷贝
-
copy.copy和copy.deepcopy对于不可变类型没有意义,全部等价于对象之间的赋值操作。
import模块导入
import 导入模块
import 模块名
3.1 导入指定目录下的模块
1 重启之后需要重新添加路径 重新导入
import sys
修改sys.path变量中路径
2 修改之后一直有效
vim ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/home/python/Desktop
保存退出 刷新文件
:wq source ~/.bashrc
3.2 重新加载模块
因为import在第一次导入的时候会创建一个模块对象
当后续再次import 的时候 会直接使用已有的模块对象
py2
reload(myapp)
py3
from imp impor reload
reload(myapp)
3.3 import A 过程
1 先判断模块A是否存在模块对象 存在就直接使用 ; 如果没有进行2
2 sys.path路径下进行模块的搜索A.py文件 如果能够找到就进行3 否则报错
3 根据磁盘的py文件 创建模块对象 并且 在当前作用域创建一个和模块名同名的对象 A
A对象中保存的时候 模块对象的引用
4 通过A调用其中任何方法 函数 类 变量
3.4 from A import B
1 先判断模块A是否存在模块对象 存在就直接使用 ; 如果没有进行2
2 sys.path路径下进行模块的搜索A.py文件 如果能够找到就进行3 否则报错
3 根据磁盘的py文件 创建模块对象 并且 在当前作用域创建一个 和模块中属性同名的 对象B
4 通过B调用
3.5 from-import 和 import区别
locals()查看当前作用域中 名字
from-import 保存模块中属性的引用在本地作用域
import 保存模块的 引用在本地作用域