Python 巧妙的实现并行
Posted 张乐乐章
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 巧妙的实现并行相关的知识,希望对你有一定的参考价值。
需求
给定一个list 针对list 中每个元素执行一定的操作(这个操作很费时间,例如爬数据的时候调用某个网站的接口),返回操作后的list
例如 给定 1-10个数,在每个数字后面加个字母a
方法
1、利用线程池pool 及map 函数 实现
1 from multiprocessing import Pool 2 from multiprocessing.dummy import Pool as ThreadPool 3 import time 4 pool = ThreadPool(10) 5 6 #定义函数 7 def add(x): 8 time.sleep(0.2) 9 return str(x) + \'a\' 10 11 ll = list(range(0,10)) 12 13 14 #原始map 15 start = time.time() 16 res = map(add, ll) 17 print res 18 print time.time() - start 19 20 #线程池map 21 start = time.time() 22 res = pool.map(add,ll) 23 print res 24 print time.time() - start
结论:
可以发现 运行时间缩短了。一定要保证所执行的函数比较费时间,才可以用,否则 大部分时间都用在分发任务上了,
多线程不一定比单线程快。 感兴趣的同学可以试试把time.sleep()去掉。
python3
from multiprocessing import Pool from multiprocessing.dummy import Pool as ThreadPool import multiprocessing import time import numpy as np def cal_sim(A,B): A = np.array(A) B = np.array(B) num = A.T * B #若为行向量则 A * B.T num = num.sum() denom = np.linalg.norm(A) * np.linalg.norm(B) cos = num / denom #余弦值 sim = 0.5 + 0.5 * cos #归一化 return sim #线程池map start = time.time() A_list = [np.array([1]),np.array([5])] B_list = [np.array([2]),np.array([3])] with multiprocessing.Pool(processes=3) as pool: results = pool.starmap(cal_sim, zip(A_list,B_list)) print (results)
参考:
http://python.jobbole.com/81690/
以上是关于Python 巧妙的实现并行的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
python基础===一行 Python 代码实现并行(转)
[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段