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()