python 加速小技巧

[python 多进程及并行计算: multiprocessing总结 & joblib.Parallel函数] (https://www.cnblogs.com/dychen/p/15743087.html)

背景

如果你想在程序中并行执行一段代码, 然后得到最后的返回结果, 如果使用多进程或者多线程会相对复杂, 这里提供一个简单方法
这里的例子就是仿照如果你有一个很长的列表, 里面都是任务, 先将整个列表任务切分成多个, 然后通过多进程或者多线程去执行, 让速度更快, 但是对于最后的结果却又是顺序的, 直接取出即可使用

from joblib import Parallel, delayed
import time
from typing import List


def single(a):
    """ 定义一个简单的函数  """
    time.sleep(1)  # 休眠1s
    # print(a)  # 打印出a
    return a


def split_list(lst: list, num: int = None, num_chunks: int = None) -> List[List]:
    """
    均匀分割列表为多个子列表
    :param lst: 传入一个列表
    :param num: 每个小列表有 num 个
    :param num_chunks: 想要将列表均匀分割成 num_chunks 个
    :return:
    """
    if num:
        return [lst[i:i + num] for i in range(0, len(lst), num)]
    if num_chunks > len(lst):
        raise TypeError(f'长度为{len(lst)}的列表无法分成{num_chunks}份')
    avg_chunk_size = len(lst) // num_chunks  # 每个小列表的平均大小
    remainder = len(lst) % num_chunks  # 余数,用于将剩余的元素添加到后一个列表中
    result = [lst[i:i + avg_chunk_size] for i in range(0, len(lst), avg_chunk_size)]
    if remainder > 0:
        result[-1].extend(lst[-remainder:])
    return result


def in_loop(i: int):
    start = time.time()  # 记录开始的时间
    for i in range(i):  # 执行10次single()函数
        single(i)
    Time = time.time() - start  # 计算执行的时间
    print("loop using " + str(Time) + 's')


def inparallel():
    start = time.time()  # 记录开始的时间
    # backend: ['loky', 'multiprocessing', 'sequential', 'threading']
    results = Parallel(n_jobs=-1, backend="threading")(
        delayed(single)(i) for i in split_list([i for i in range(10000)], num=100))
    for result in results:
        ...
        # print(result)
    print(len(results))
    Time = time.time() - start  # 计算执行的时间
    print("inparallel using " + str(Time) + 's')


if __name__ == '__main__':
    in_loop(100)
    inparallel()

posted @ 2023-08-07 16:02  つつつつつつ  阅读(16)  评论(0编辑  收藏  举报