python中数据类型
-
数字: int float 复数 bool
-
列表
-
字典
-
元组
-
集合
numpy
数据类型:ndarray, 可以定义任何维度
pandas
一维:series
二维:dataframe
三维:multindex 或者叫做 panel
为什么数据分析中不用python内置的数据类型,而使用 numpy 或者 pandas
- numpy和pandas的数据结构是要 优于 python内置的结构
- numpy中默认采用多进程的方式处理数据
- numpy底层是采用c来处理数据
并行:多个cpu同时处理多个程序
并发:一个cpu在一个很小的时间段之内在多个程序之间来回切换执行
__name__的意义:
如果执行执行当前文件 __name__== ‘__main__’
如果是在其他文件中执行 __name__ == ‘文件的名称’
多进程的创建方式
-
导包
from multiprocessing import Process -
创建多个函数
-
创建进程
# Process函数中必须包含一个 target参数,指定创建进程的函数名称 p1 = Process(target=run1) -
执行进程
p1.start()
进程对象的 join 方法的意思: 阻塞进程
获取进程的编号
- 子进程的编号: os.getpid()
- 主进程的编号:os.getppid()
带有参数的进程
-
传递非关键字参数
-
传递关键字参数
def run1(name, age=0): print('run1--', name, age) # 给进程传递非关键字参数,需要定义 args 参数,类型是 元组或者列表 # 给进程传递关键字参数,需要定义 kwargs 参数,类型是 字典 p1 = Process(target=run1, args=('a',), kwargs={'age':10})
守护进程
- 作用: 当主进程结束之后,不管子进程也没有结束,当前所有进程全部结束
- 方法:子进程对象.daemon = True
可变对象:可以对数据内部进行增删改操作
- 字典
- 列表
- 集合
不可变对象:不能对数据内部进行更改
- 字符串
- 元组
- 整型
浅拷贝:把对象的一维数据拷贝一份,放入到新的内存中
-
变量.copy()
a = [1,2,[3,4]] b = a.copy() -
变量[:]
a = [1,2,[3,4]] b = a[:] -
copy.copy
import copy a = [1,2,[3,4]] b = copy.copy(a)
深拷贝: 把对象的所有数据全部拷贝一份,放入到新的内存中
-
copy.deepcopy
import copy a = [1,2,[3,4]] b = copy.deepcopy(a)
能够使用 with 语法,必须在类中定义两个方法
-
__enter__ -
__exit__class A: def __enter__(self): # 实例化 def __exit__(self): # 关闭句柄
多进程之间数据不共享,如果需要多进程之间数据共享,最常用的三种方式
- 管理器 manager
- 队列 queue
- 管道 pipe
- 套接字 sock (不常用)
进程池
-
为什么要使用进程池:因为不会频繁的创建和销毁进程,所以节省资源
-
进程池中一般创建多少个进程,效率最高: 电脑中 cpu核数的 两倍
-
创建进程的步骤
# 1,导包 from multiprocessing import Pool if __name__ == "__main__": # 2,创建进程池 # Pool方法中的参数就是 初始化创建 进程的数量 pool = Pool(3) # 3,用进程池执行进程 # apply_async 中第一个参数就是 函数的名称 pool.apply_async(函数名称) # 4,先关闭进程池 pool.close() # 5,等待所有的请求处理完成之后,再去 销毁进程池的资源 pool.join()
闭包一定要满足3个条件
- 外层函数一定要包含一个内层函数
- 外层函数一定返回内层函数的函数名称
- 内层函数一定是使用外层函数的变量
python中的多线程是伪多线程,因为GIL(全局解释性锁)的存在,所以多线程中cpu的执行是并发的,而不是并行的
GIL: 全局解释性锁
多线程的创建方式
-
导包
from threading import Thread -
创建多个线程
t1 = Thread(target=run1) -
执行
t1.start() -
等待子线程执行完之后,在执行主线程
t1.join()
守护线程
- 作用: 主线程结束之后,不管子线程也没有结束,整个程序就结束
- 使用方式: 子线程对象.setDaemon(True)
多线程之间数据是共享的, 但是共享会带来数据错乱,所以必须加锁解决
加锁的方法
- 加锁:lock.acquire()
- 释放锁:lock.release()
进程和线程的对比的三个方向
关系对比
区别对比
优缺点对比
关系对比
线程是依附在进程里面的,没有进程就没有线程。
一个进程默认提供一条线程,进程可以创建多个线程。
image-20200823134714393
区别对比
进程之间不共享全局变量
线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 加锁
创建进程的资源开销要比创建线程的资源开销要大
进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
线程不能够独立执行,必须依存在进程中
多进程开发比单进程多线程开发稳定性要强
优缺点对比
进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核
使用场景
计算密集型:CPU 长时间满负荷运行, 如图像处理、大数据运算、科学运算等。使用多进程
I/O 密集型:网络 IO, 文件 IO, 设备 IO 等。使用多线程
本文详细介绍了Python中的线程与进程,包括数据类型、numpy和pandas的使用,多进程与多线程的创建、同步及优缺点。讲解了进程的join方法、守护进程、数据共享方式,以及GIL对多线程的影响。同时探讨了进程池的使用,强调了根据任务类型选择多进程或多线程的场景。

5745

被折叠的 条评论
为什么被折叠?



