Python高性能计算学习笔记
前言
加速
1 性能分析
print
time & timeit
line_profile: 逐行分析
# 1 print(个性化监控)
def sleep():
time.sleep(0.01)
def sleep_iter(iter_):
time.sleep(0.02)
for i in range(iter_):
t1=time.time()
sleep()
t2=time.time()
print(f"第{i+1}次迭代中sleep用时:{t2-t1}")
sleep_iter(5)
# 2.1 %time 示例 统计单行代码运行时间
def sleep():
time.sleep(0.01)
def sleep_iter(iter_):
time.sleep(0.02) # 打印中未统计
for i in range(iter_):
%time sleep() # 每次运行sleep总耗时约为10ms,也即0.01s。主要在等待,CPU几乎没有时间开销
sleep_iter(5)
%%time
# 2.2 %%time 示例 统计整个cell的运行时间
def sleep():
time.sleep(0.01)
def sleep_iter(iter_):
time.sleep(0.02)
for i in range(iter_):
sleep()
sleep_iter(5)
# 2.3 %timeit 示例 统计单行代码的平均运行时间,指定代码默认运行7次,每次循环10次
def sleep():
time.sleep(0.01)
def sleep_iter(iter_):
%timeit time.sleep(0.02) # 统计过程中,
for i in range(iter_):
sleep() # 打印中未统计
sleep_iter(5)
# 3 逐行分析
# pip install line_profiler
2 并行加速
通过并行计算将CPU核数利用起来,从而实现加速的主题
加速:
- 优化计算逻辑、
# 直接逻辑判断(速度比较快)
def replace_by_logic(data, shrehold, target):
data[data <= threshold] = target
return data
- 使用高效的底层语言
- 更充分的利用计算资源
from multiprocessing import Process
import os
import time
# 一个时间开销为 2s 的任务
def task_2s(i=None):
time.sleep(2)
if i:
print('子进程: {} - 任务{}'.format(os.getpid(), i))
start = time.time()
for i in range(2):
task_2s()
end = time.time()
print('顺序完成两次,总耗时{:.2f}秒 \n'.format(end-start))
print('当前母进程: {}'.format(os.getpid()))
start = time.time()
p1 = Process(target=task_2s, args=(1,))
p2 = Process(target=task_2s, args=(2,))
p1.start()
p2.start()
p1.join()
p2.join()
end = time.time()
print("两个进程同时完成,总耗时{:.2f}秒".format((end - start)))
2.1 名词理解
- 并发 vs 并发
- 进程 vs 线程
进程:系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间
线程:是操作系统能够进行运算调度的最小单位,一个进程中可以并发多个线程(💡对于其他语言,多核 CPU 是支持多线程并行的。但由于 GIL 全局解释锁的存在,Python 一个进程同时只能执行一个线程)
2.2 常用库
Multiprocessing
Python 中的一个标准库,主要用于管理 Python 程序中的多个进程,以提高程序的执行效率。使用时可以找到一个安全可拆解的离散对象,代码的改写以如何将这些对象分配到不同进程为主,逻辑本身的改动较少。Dask
Python 的第三方并行计算库,可扩展现有的 Python 生态系统。支持数据处理常用的数据结构,如 pandas.DataFrame 与 numpy.Array,因此相比其他大数据处理库的改写量较少;另外对于缓解内存压力尤为友好。
3 GPU加速
学习资料
https://www.heywhale.com/org/series_60dbf244c693f4001784cd22/project/66bf4bdabba589356c923566
https://www.machinelearningplus.com/python/parallel-processing-python/