三、python基础知识

  1. 函数:
    1. list、dict、tuple、set、string:
      1. list:元素有序、可修改,不要求数据类型一致;dict:无序,可修改,key和value不要求数据结构一致;tuple:有序,不可修改,不要数据类型一致,定义只有一个元素的时候,括号前面必须加逗号;set:无序,可修改,数据结构不要求一致、空集必须表现为s=set();string:有序,不可修改;
      2. list和tuple底层数据结构:线性表,分为顺序表(将表元素直接顺序存放在一块划分的连续区域内)、链接表(将表元素放在通过链接构造起来的系列存储块里);list长度不固定可修改,tuple长度固定
      3. set本质是dict:主要使用hash对元素做散列计算和eq对元素做散列值对判断
      4. dict底层数据结构:伪随机探测的散列表
    2. 内存管理机制:
      1. 引用计数:记录了对象有多少引用,即引用计数,引用计数增加,多一个索引,结果+1;引用计数减少,销毁一个索引,结果-1;循环引用,如对象a中的属性引用b,对象b中的属性引用a,会导致a,b无法释放。
      2. 内存池机制:许多申请的小块内存,很快被释放,当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量碎片,导致效率变低。内存池的概念是预先在内存中申请一定数量、大小相等的内存块留作备用,当有内存新需求,优先从池子中进行分配,不够再申请新的。分为大内存、小内存,以256k为界限,小于256k时,pymalloc会在内存池中申请内存;大于256的时候,执行new/malloc申请内存
      3. 垃圾回收机制:
        1. 引用计数:是一种直观的垃圾收集机制,当引用计数为0,则说明没有任何引用指向该对象,表示可以回收。优点:实时性,缺点:维护引用计数消耗资源、无法解决循环引用问题
        2. 标记清理:对执行删除操作后的每个引用-1,把等于0的引用放进死亡容器内,大于0的引用放进存活容器内,遍历存活容器,查看是否有存活容器调用了死亡容器内的对象,如果有就把该对象挪到存活容器内,最后将死亡容器内的所有对象删除。缺点:清除非活动的对象前必须顺序扫描整个堆内存
        3. 分代回收:新创建的对象作为0代,每执行一个标记-清理,存活的对象代数就+1,代数越高的对象(存活时间越久),进行标记-删除的时间间隔就越长
      4. 锁:
        1. gil锁:全局解释锁,在同一进程下可开启多个线程,但同时刻只有一个线程能执行,无法使用多核技术,但保证了数据安全性(同一时间只有一个线程能修改数据)、避免了大量加锁解锁
        2. 同步锁:同一时刻的一个进程下只能使用一个CPU,要确保这个线程下的程序在一段时间内被CPU执行,需要用到同步锁;对公共数据的操作前后加上上锁和释放锁的操作即可使用,保证程序的完整性,避免遇到io操作,cpu切到其他线程上去
        3. 递归锁和死锁:
          1. 死锁,指两个或两个以上的进程或线程在执行程序的时候,因争夺资源而互相等待的现象;产生条件:互斥条件,不可剥夺,请求和保持(请求新资源,继续占用原资源),循环等待(p1占p2资源,p2占p3资源,p3占p1资源)
          2. 递归锁,支援同一个线程中多次请求同一资源,提供可重入锁,这个Rlock内部维护着一个lock和一个counter,counter记录了acquire的次数,从而使得资源可以多次被rquire,直到一个线程的所有acquire都被释放掉,其他线程才可以获取资源
    3. 装饰器:闭包(让你可以在一个内层函数中访问到外层函数的作用域),修改其他函数的功能的函数,在不改变原函数或方法的现有代码的基础上,能够为函数或者方法添加新的功能,具备简洁,易读写的特点
    4. 迭代器(将原始数据包了一层,加了个索引):访问集合的一种方式,可以记住遍历的位置的对象,只能往前不能后退,有两个方法iter()创建迭代器对象和next()输出迭代器的下一个元素
    5. 生成器:
      1. 使用了yield的函数被称为生成器,yield是一个关键字,用于定义生成器函数。生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回。适用场景:可控文件的读(按需读取指定大小的文件,避免读取内容过多,内存溢出)
      2. 第一次调用next()的时候,函数执行第一个yield语句,下一次调用会继续从停止的地方继续执行,直到执行下一个yield函数,返回生成值。
    6. 迭代器和生成器比较:
      1. 迭代器是个类,且需要实现iter()、next()魔法函数,相对而言较冗余
      2. 生成器是个yield函数,相对而言,代码会更少
      3. 同一代码内,生成器函数只能遍历一次
    7. 多线程
      1. 创建方式:threading.Thread(target=线程函数名,args=参数)
      2. 多线程相当于一个并发系统,可以同时执行多个任务
      3. 线程池在启动的时候,创建大量空闲的线程,当函数提交到线程池,会分配一个空闲线程来执行,执行结束后回归线程池恢复空闲状态,等待执行下一个线程
      4. 线程池种类:
        1. 创建固定数量的线程池,适用于线程数明确或服务器负载较重,对线程有严格限制的场景
        2. 创建只有一个线程的线程池,适用于需要保证顺序执行各任务,并且在任意时间点,不会同时有多个线程的场景
        3. 创建可缓存的线程池,适用于可创建一个无限扩大的线程池,服务器负载压力小,执行时间短,任务多的场景
        4. 创建可供调度的线程池,可延时启动、定时启动,使用多个后台线程执行周期任务的场景
        5. 创建一个拥有多个任务队列的线程池,可以减少连接数,创建当前cpu可用核数的线程来执行任务,适用于耗时大,可并行执行的场景
    8. __new__和__init__:init方法为初始方法(静态方法),new方法才是真正的构造函数(实例方法);new方法默认返回实例(cls)对象供init方法、实例方法使用,init方法无返回;init方法为类的实例提供一些属性或完成一些动作,定制实例对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值