当前位置:   article > 正文

python for循环多进程执行应用_python for循环 多进程

python for循环 多进程

   以前了解过JAVA多线程多进程,python也学到过,但是就没有遇到过具体的业务场景,最近要做一个文本匹配的任务,需要对70W条文本数据进行推荐相似度的计算,需要做一个全遍历——也就是一个70W个元素的list遍历的时候,和自身做一些相关的计算。list中的每个元素没768维的向量,然后得出结果后,还需要排序,然后写入文件存储。这个场景就非常耗时,为了减少消耗时间,在单机的环境下,就想到了并行。

python的多线程是假的多线程——由于GUI的原因,反正巴拉巴拉。。。就想着用 multiprocessing,这里采用了简单的Pool。开始直接上代码:

  1. datas=[]
  2. for i in range(0,700000):
  3. a = np.random.random((2,))
  4. datas.append(a)
  5. p=multiprocessing.Pool(4)
  6. param=[]
  7. for ele in tqdm(datas,desc='param:'):
  8. t=(ele,datas)
  9. param.append(t)
  10. print('*'*10)
  11. b = p.map(doSomething, param)
  12. def doSomething(a,d):
  13. # t1 = time.time()
  14. # r=cdist([a],datas,"cosine")[0]#计算70W次cos值
  15. # t2 = time.time()
  16. # print('t2-t1:%4f' % (t2 - t1))
  17. r=0
  18. time.sleep(0.0001)
  19. return r

把上面的70W次的for循环改写成下面的多进程,运行直接报错。错误在于pool.map(A,B)中的A是函数,B是函数的传入参数,这个B只能是单个的。为何我这里错了呢?这里param是单个的呀!然而doSomething()函数有2个参数,代码本身就有问题。改写下面2种方式:

  1. def do(param):
  2. return doSomething(param[0],param[1])
  3. def doSomething(param):
  4. t1 = time.time()
  5. r=cdist([param[0]],param[1],"cosine")[0]#计算70W次cos值
  6. t2 = time.time()
  7. print('t2-t1:%4f' % (t2 - t1))
  8. r=0
  9. time.sleep(0.0001)
  10. return r

一种是函数嵌套,另一种是直接在doSomething()函数直接实现相应功能。

这里最重要的一点就是加入要传入多个参数的话,就必须把多个参数进行封装,封装成dic、tuple都行。然后再在函数里面想办法使用这些封装的参数来实现功能。

最后看看耗时对比效果,这里为了能够展示出效果,把里面的计算cos的功能屏蔽掉,使用sleep()来代替——不代替的话,我这个机子要跑几百个小时。

完整代码:

  1. '''
  2. @Author : HY
  3. @Software: PyCharm
  4. @File : mutilprocess.py
  5. @Time : 2019/9/18 23:45
  6. @Desc :
  7. '''
  8. import time
  9. import multiprocessing
  10. from tqdm import tqdm
  11. from scipy.spatial.distance import cdist
  12. import numpy as np
  13. def doSomething(a,d):
  14. # t1 = time.time()
  15. # r=cdist([a],datas,"cosine")[0]#计算70W次cos值
  16. # t2 = time.time()
  17. # print('t2-t1:%4f' % (t2 - t1))
  18. r=0
  19. time.sleep(0.0001)
  20. return r
  21. def do(param):
  22. return doSomething(param[0],param[1])
  23. if __name__ == '__main__':
  24. datas=[]
  25. for i in range(0,700000):
  26. a = np.random.random((2,))
  27. datas.append(a)
  28. t1=time.time()
  29. for e in tqdm(datas):
  30. doSomething(e,datas)
  31. t2=time.time()
  32. print('t2-t1:%4f'%(t2-t1))
  33. param=[]
  34. for ele in tqdm(datas,desc='param:'):
  35. t=(ele,datas)
  36. param.append(t)
  37. print('*'*10)
  38. p=multiprocessing.Pool(4)
  39. b = p.map(doSomething, param)
  40. t1 = time.time()
  41. b=p.map(do,param)
  42. p.close()
  43. p.join()
  44. t2 = time.time()
  45. print('t2-t1:%4f' % (t2 - t1))

结果:

单核CPU上需要12559秒,4核CPU上只需要362秒。效果很明显!

 

参考:https://blog.csdn.net/qq_23869697/article/details/84975774

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/74811?site
推荐阅读
相关标签
  

闽ICP备14008679号