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核数利用起来,从而实现加速的主题
加速:

  1. 优化计算逻辑、

# 直接逻辑判断(速度比较快)
def replace_by_logic(data, shrehold, target):
  data[data <= threshold] = target
  return data

  1. 使用高效的底层语言
  2. 更充分的利用计算资源
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/

posted @ 2024-08-16 21:05  zgwen  阅读(16)  评论(0编辑  收藏  举报