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/

 

posted @ 2018-02-08 14:14  乐乐章  阅读(885)  评论(0编辑  收藏  举报