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/