• python GIL全局锁、描述器


    python不用显示释放内存,reference count 引用计数,如果不用就减一,当为0的时候,释放内存,refcunt -1。

    竞争冒险,进程有多个线程运行,减小不是antomc也即不是原子性,可能会有其他进程插入,无法保证每个object被正常释放。,

    解决:加锁,确保程序只有一个线程运行。

    1. a = 1
    2. lock.aquire()
    3. if a > 0:
    4. a -= 1

    GIL是全局锁。只有一个线程锁,避免死锁。

    问题有什么,在多核cpu时代。用多进程避开GIL问题。2.自己写cexctention

    描述器

    1. class Name:
    2. def __get__(self, obj, objtype):
    3. return "Peter"
    4. class A:
    5. name = Name()
    6. print(A.name)

    这个会调用class A的get函数。

    1. claas Name:
    2. def __get__(self,obj, objtype):
    3. return "Peter"
    4. class A:
    5. def __init__(self):
    6. self.name = Name()
    7. o = A()
    8. print(0.name)

    打印的是main的函数初始化的意思。

    load_attr,当使用.name,调用description的时候调用load_attr,

    装饰器。装饰器就是将函数作为一个对象传入另外一个函数当中进行运算。

    在python中函数也是一个对象,所以函数也可以被当作参数传入,calc_number

    1. def double(x):
    2. return x ** 2
    3. def triple(x):
    4. return x ** 3
    5. def calu_number(func,x):
    6. return func(x)
    7. calu_number(double,3)
    8. calu_number(triple,3)
    9. # 6 # 9

    函数本身也可以作为返回值。

    1. def calu(n):
    2. def multiple(x):
    3. return n * x
    4. return multiple
    5. double = calu(2)
    6. triple =calu(3)
    7. print(doulbe(2))
    8. print(triple(3))

    使用就是

    1. def dec(f):
    2. return 1
    3. @dec
    4. def f(x):
    5. return x ** 2
    6. print(f(x)) # 1
    7. # 相当于
    8. def dec(f):
    9. def f(x):
    10. return x ** 2
    11. return 1

    所以可以写一些插入相关功能的函数,比如时间装饰器。前面已经写过了。

    带参数也是参数先调用一次返回参数,然后这个参数在调用函数。

    有模板的,

    1. import time
    2. class Timer:
    3. def __init__(self, func):
    4. self.func = func
    5. def __call__(self, *args, **kwargs):
    6. star = time.time()
    7. ret = self.func(*args, **kwargs)
    8. print(time.time() - star)
    9. return ret
    10. @Timer
    11. def add(a,b):
    12. return a+ b
    13. #d等价于
    14. add = Timer(add)
    1. class add_str(cls):
    2. def __str__(self):
    3. return str(self.__dict__) # 用字典的形式重载
    4. cls.__str__ = __str__
    5. return cls
    6. @add_str
    7. class MyObject:
    8. def __init__(self,a,b):
    9. self.a = a
    10. self.b = b
    11. MyObject = add_str(MyObject)
    12. o = Myobject(1,2)
    13. print(o)
    14. {"a":1,"b":2}

    生成器

    本身生成器只能用next寻找下一个值,

    python 什么会被认为True

    1. a = False
    2. if a is True:
    3. return True
    4. if a == True:
    5. return True
    6. if a:
    7. return True
    8. if bool(a):
    9. return True

    第二个,==不推荐,已经在python里面可以重载,__eql__,这样导致错误出现。

    在源码当中,PyObject_IsTrue。内置数据,如果是数判断是不是0,如果是序列就判断是否是空。如果是自定义的,找是否有__bool__这个属性,如果有的话,调用

    1. func = lookup_maybe_method(self, &PyId_bool__, &umbound);
    2. if (func == NULL){
    3. if (PyErr_Occurred()){
    4. return -i;
    5. }

    已经是否定义lens,也即判断有没有bool属性或者长度属性,如果都没有,返回1  

    MRO 多继承

    可以继承其他的方法和数据,printA。python的mro用的是C3算法。

    local class walk,

    单调性。任何class使用方法来自于直接父类。

    Class里面的self的意思。

            建立对象的时候才会出现。也即调用对象的时候才能知道是self.也即实例化类才能调用。

    1. class A:
    2. def f(self,data):
    3. print(self.name)
    4. print(data)
    5. o = A()
    6. print(A.f())
    7. print(o.f())

    如果给o赋值o.name = "FS" 调用用的是描述器。

    起效果的是function里面的descripe函数。

    MethodClass

    1. class M(type):
    2. def __new__(cls, name, bases, dict):
    3. return type.__new__(cls, name, bases, dict)
    4. class A(metaclass = M):
    5. pass
    6. A = M("A", (),{} )
    7. o = A()

    此处,o =A()会调用A的new 和init函数,当然,A= M(“A“,(),{})的时候,也会调用m的init和new,这个调用是隐式的。

    1. class M(type):
    2. def __new__(cls, name, bases, dict):
    3. return type.__new__(cls, name, bases, dict)
    4. def __init__(self, name, bases, dict):
    5. return type.__init__(seflf, name, bases, dict)
    6. def __new__(cls, name, bases, dict):
    7. return type.__new__(cls, name, bases, dict)

    __new__ 是实例化这个对象,__iniit__ 初始化这个对象。—__call__ 新建的类产生实例的时候调用的。

    __slots__ 建立白名单,使得函数更具有健壮性。速度快更加节省内存,

    @  super().超类继承关系

    当在类中调用关于super()的信息的时候,函数中见的代码变成,在封装的时候,其他人已经做的很好了,我们只要增加一些功能的话,可以直接用super(),继承父类的方法,

    1. class Animal:
    2. def __init__(self, age):
    3. self.age = age
    4. class Person(Animal):
    5. def __init__(self, age, name):
    6. self.name = name
    7. class Male(Person):
    8. def __init__(self, name , age):
    9. super(Person, self).__init__(age)
    10. self.gender = "male"
    11. m = Male(33,"perter")
    12. print(m)

    super(cls, self) 第一个决定从哪开始找,第二个决定函数对象和mro

    1. class A:
    2. def __init__(self):
    3. print("A"
    4. class B(A):
    5. def __init__(self):
    6. super(B,self).say()
    7. class C(A):
    8. def __init__(self):
    9. print("C"
    10. class M(B,C):
    11. def __init__(self):
    12. B.say(self)
    13. m = M()
    14. m.say() #C
    15. #因为M 的mro是 BCA 在b上调用self,走的是m的mro,所以从b开始,然后到c,发现直接输出c

    在B

    staticmethod和classmethod

    1. class A:
    2. @staticmethod
    3. def F(x):
    4. print(x)
    5. A.f(1# 1

    可以将功能绑定在类上,而不是类的对象上很有用,虽然同样可以在类的对象上调用这个方法。,

    1. class A:
    2. @classmethod
    3. def F(cls,x):
    4. print(cls,x)
    5. A.f(1# 1

    会把class当作第一个对象传进来。 

    atexit module 只有两个函数

    在python退出的时候,运行一些代码。

    1. import atexit
    2. def f():
    3. print(""exit")
    4. atexit.register(f)
    5. 或者在register传入参数。
    6. @atexit.register
    7. def f():
    8. print("exit")
    9. atexit.unregister(f)

    Malloc内存管理系统

    在系统里面有一个block和一个pool

    asyncio处理需要等待任务

    namedtuple

    为了创建数据的时候,以后还记得自己创建的数据是什么意思,这里有一个很好的数据结构是nametuple,意味着数据的描述很有用,使用数据结构的时候,对数据的分析在于是否能表达完全,。

    比如设置坐标的时候,nametuple的作用就显而易见。

    1. from collections import namedtuple
    2. # 定义一个namedtuple类型plor,并包含name,sex和age属性。
    3. User = namedtuple('Plor', ['x', 'y'])
    4. #赋值
    5. User = User(x = '22', y = '23')
    6. #或者用一个列表
    7. User= User._make(['22','23'])

  • 相关阅读:
    Java 线程池手动创建示例及自我理解的解读 ThreadFactory手动创建示例
    Centos安装openjdk11并配置JAVA_HOME
    python 根据shp文件解析经纬度市县信息
    智能算法--基于差分进化算法(DE)的神经网络优化UCI数据集
    Transformer模型转换:从TF到PyTorch的实战指南
    循环for处理数据
    linux上如何搭建Java环境
    javaweb学生量化设计和实现计与开发
    数据库内核面试中我不会的问题(4)
    机器学习(十九)总结
  • 原文地址:https://blog.csdn.net/weixin_55435895/article/details/126435288