zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    测试框架 MSTest V2与单元测试
    string字符串格式
    重构概述
    代码的坏味道
    this.Dispatcher.Invoke与SynchronizationContext
    C# new关键字
    Servlet的API和生命周期
    Servlet快速入门
    Spring介绍
    Oracle数据安全解决方案(1)——透明数据加密TDE
  • 原文地址:https://www.cnblogs.com/zle1992/p/8431312.html
Copyright © 2011-2022 走看看