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(代码片段

骚操作!一行 Python 代码实现并行

并行LINQ PLinq