深拷贝与浅拷贝
import copy
浅拷贝:将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。copy.copy()
深拷贝:将一个对象拷贝到另一个对象中,新开辟了一个空间,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。copy.deepcopy()
进程、线程、协程
进程process:资源分配的最小单位,一个可执行的程序被加载到内存中。拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度。
多进程应用于CPU密集,进程间通信的方式:队列queue、管道pip
线程Thread:操作系统调度的最小单位,进程内的一个执行单元,拥有自己独立的堆和栈,共享堆,不共享栈,也有操作系统调度。线程保存到CPU的栈中
多线程应用于IO密集。IO操作:将硬盘上、网络上的数据进行读写操作
协程Coroutine:又称微线程,纤程。单线程下实现并发效果,可以保留上次执行位置,遇到IO自动切换。协程保存在自己的栈。
协程优点:
1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
2. 单线程内就可以实现并发的效果,最大限度地利用cpu
协程缺点:
1.协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
2.协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
协程常用库:greenlet框架(封装yield的基础库)、gevent(基于greenlet的高级库)。
IO多路复用:socketserver,多个客户端连接,单线程下实现并发效果
IO多路复用机制:select、poll、epoll
# select linux下默认最大连接数1024,监控数量有限,无法知道哪个socket链接活跃,
# poll 在select基础上没有监控数量限制,
# epoll 没有监控数量限制并且能知道哪个socket链接有活跃
os和sys模块
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
python垃圾回收机制
引用计数、标记清除、分代回收
引用计数:当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1。当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。
标记清除:基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点,以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没有标记的对象释放
分代回收:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。,那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。
readline、readlines、read
readline:一行一行的读,底层是迭代器原理,适合大文件读取
readlines:读取整个文件
read:从当前位置起读取,一般用于小文件读取