GIL锁
GIL锁知识点Python GIL的概念
GIL:全局解释器,同一个进程中的每个线程在执行的过程都需要现获取GIL,保证在同一个时刻只有一个线程可以执行代码。
python程序与GIL本身无关,仅仅是因为历史原因构建了cpython解释器导致,如果要在cpython中移除GIL,会很难。
GIL对Python的影响
线程释放GIL锁的情况:在IO操作等可能会引起阻塞的system call之前可以暂时释放GIL,但在执行完毕后,必须重新获取GIL python3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或者python2.x tickets计数达到100。
在利用cpython解释器时,使用多进程是可以利用多核的cpu资源的。或者利用其它python解释器就没有这个问题,或者可以利用第三方语言(如c)来实现多线程就可以解决该问题。
多线程运行时是会比单线程性能有所提升的,因为遇到IO阻塞时会自动释放GIL锁。
补充知识
c语言在linux中的编译
1234# 将.c文件编译为可执行文件gcc xxx.c# 将.c文件编译为动态库文件(可被其它程序调用)gcc xxx. ...
Python方法的解析顺序
方法的解析顺序表知识点背景
调用父类方法的几种方式
继承的父类名.方法(self, 参数)
super().方法(参数)
super(继承的父类名, self).方法(参数)
父类名.方法(self, 参数)12345678910class Parent(Object): def __init__(self, age, name): passclass Son1(Parent): def __init__(self, age, name): Parent.__init__(self, age, name) pass
缺点:这种方式对于多继承可能会产生多次调用爷爷级别的继承类
super().方法(参数)12345678910class Parent(Object): def __init__(self, age, name): passclass Son1(Parent): def __init__(self, age, name): super()._ ...
深浅拷贝
深、浅拷贝知识点概念
引用
在复制一个变量时,只复制它的引用方式,而没有重新开辟空间来存放它引用的数据,当被复制变量发生变化时,新的变量数据也会同时发生变化。
123a = [1,2]b = aa.append(3) # a变则b变
浅拷贝:
在拷贝一个变量时,重新开辟空间来存放它内部数据的引用方式,当内部引用的数据发生变化时,拷贝后的对象同时发生变化。通过copy中的copy方式复制变量:a=copy.copy(b)
1234567891011a = [1,2]b = [3,4]c = [a,b]d = copy.copy(c)a.append(3) # 拷贝地址的内容发生变化,则d发生变化c.append((1,2)) # 拷贝的对象发生变化,d不变e = c[:] # 利用切片达到的结果等同于e = copy.copy(c)# 字典中也有个方法copypersonal = dict(name = "wuxiang", age=27)copy_data = personal.copy() # 此处的copy也是浅拷贝
深拷贝:
在拷贝一个变量时,重 ...
私有化、继承、多态
私有化、继承、多态知识点私有化
xx:公有变量
_x:单前置下划线,用于定义私有化属性或方法,当在其它模块通过from xxx import *时是无法导入的,但是可以通过子类和类对象进行访问,也可以通过导入具体的变量名进行访问
1234567# 导入具体的变量名from Demo1 import _a# 在子类中也可直接访问class Test2(Test1): def func(self): print(self._a)
__xx:双前置下划线,用于定义私有化属性或方法,成员之间无法进行访问,同时子类也无法访问。但是可以通过【对象名._类名__私有对象名】进行访问
__xx__:双前后下划线,python内置的魔法对象或属性。自已不要发明这类名字
xx_:单后置下划线,为了避免自己定义的变量名与系统的关键字冲突
import导入模块导入顺序12345678910# 检查模块的导入顺序import sysprint(sys.path) # sys模块中有一个path方法会打印出导入模块时的顺序# 通过sys.path.append(路径)可以向系统中 ...
类中属性和Property
类中属性和property知识点类对象/属性、实例对象/属性
实例化过程:
当通过类名(a)实例化一个对象的时候,此时会调用类中__new__方法开辟一个独立的空间并返回该空间的引用(对象b),然后将该引用传递给 __init__方法,__init__方法会在新开辟的空间中初始化属性信息(变量),而对象a所拥有的各类方法则可以通过__class__方法直接寻找到类对象中的方法。
调用方式:
实例对象:可以调用实例属性、实例方法、类属性、类方法、静态方法
类对象:可以调用类对象、类属性、静态方法
实例对象调用类属性的方式:实例对象名.__class__.类属性名
property属性
定义和调用
方法1:通过添加修饰符
定义时,在实例方法的基础上添加**@property装饰器**,并且仅有一个self参数。调用时,无需加括号
设置property属性赋值时,使用xx.setter装饰器
设置property属性删除时,使用xx.deleter装饰器
12345678910111213141516171819202122class Test(object): d ...
Python魔法方法
魔法相关的内容知识点切片1234list_name = [1, 2, 3, 4, 5, 6]list_name[:3] = [11] # 会用新列表的信息替换掉原列表的前三个元素值,按照个数一一对应,少则其它位置不变list_name[:3] = [11, 22, 33, 44, 55, 55] # 多的话,原列表除切片位置意外的保持不变,然后切片位置全部用新列表覆盖
私有属性
获取实例对象中的所有实例属性:实例对象名.__dict__
获取类对象中所有的类属性:类名.__dict__
私有属性在对象中的存储方式
对一个对象设置私有属性,则对象会将其名称修改为【_类名__属性名】来存储
魔法属性123456789101112131415161718192021222324252627282930313233343536373839# __doc__: 返回类的描述,也就是类的注释对象名.__doc__# __class__:获取生成当前实例对象的类名对象名.__class__# __module__:获取对象所处的模块(文件名)对象名.__module__# __init_ ...