python 多种并行提高运行效率

一.使用np.vectorize
例子:

import numpy as np 
def myfunc(a, b):
    if a>b:
        return a-b
    else:
        return a+b

vfunc = np.vectorize(myfunc)
t0=time.time() 
vfunc(np.random.randint(5,size=10000000), 2)
t1=time.time()
print('speed_times:'+str(t1-t0))
#speed_times:3.2735631465911865
t0=time.time() 
[myfunc(data, 2) for data in np.random.randint(5,size=10000000)]
t1=time.time()
print('speed_times:'+str(t1-t0))
#speed_times:7.929015398025513

优点:
并行执行快
缺点:
输出要求严格,这里myfunc只能返回一个值,如果是list,dict类型就不行了

二.使用ProcessPoolExecutor
在concurrent.futures 库中有ThreadPoolExecutor(多线程),ProcessPoolExecutor(多进程)
ThreadPoolExecutor,ProcessPoolExecutor的区别:
ThreadPoolExecutor:
ThreadPoolExecutor多线程并行执行任务,可以共享当前进程变量,但缺点也很致命,由于python GIL(Global Interpreter Lock 全局解释器锁)
的原因,及时多线程,但其实仍然最多只能占用CPU一个核,准确只能说是并发了,如果指定的任务和线程数不恰当(比如一个任务很短,线程数量很多,导致线程频繁调用回收),那么效率还不如单线程
ProcessPoolExecutor:
ProcessPoolExecutor可以使用多核进行计算,但缺点就是进程之间共享数据就比较麻烦,消耗更多的内存。
例子:
注意ProcessPoolExecutor使用的位置,否则会造成多进程循环调用,会报
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending错误。

from concurrent.futures import ProcessPoolExecutor
  
URLS = ['http://www.baidu.com', 'http://qq.com', 'http://sina.com']
  
  
def task(url, index,timeout=10):
    return index,url
     
#在此例子中if __name__ == "__main__":一定要加,因为没有if __name__会在创建子进程的时候又会运行,导致错误
if __name__ == "__main__": 
    p = ProcessPoolExecutor(max_workers=3)
    results = p.map(task, URLS,range(3))
    p.shutdown(wait=True)
    for ret,url in results:
        print(ret,url)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python并行计算是指通过利用多个处理器或多个计算资源,同时执行多个任务,以提高程序的运行效率和性能。在Python中,可以使用多种模块来实现并行计算,如multiprocessing、pathos、concurrent.futures和pp模块。其中,multiprocessing模块提供了多进程的支持,可以通过创建多个子进程来并行执行任务。pathos模块则提供了更高级的并行计算功能,可以在多个计算资源上执行任务。而concurrent.futures和pp模块则提供了更加灵活和简洁的并行计算接口。 下面是一个示例代码,展示了使用multiprocessing模块进行多进程并行计算的方法: ```python import multiprocessing def worker(num): """子进程的任务函数""" print(f'Worker {num} started') # 执行一些任务 print(f'Worker {num} finished') if __name__ == '__main__': # 创建多个子进程 processes = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() # 等待所有子进程结束 for p in processes: p.join() print('All workers finished') ``` 以上代码中,通过创建5个子进程,并分别执行worker函数的任务。每个子进程都会打印开始和结束的信息,并执行一些任务。最后,主进程等待所有子进程执行完成后退出。 这样,我们就可以利用并行计算的方式,提高Python程序的运行效率和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python并行计算(完结篇):并行方法总结](https://blog.csdn.net/weixin_46713695/article/details/126642339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python3,如何实现CPU的并行计算,那还不简单,5种方式,这篇就搞定。](https://blog.csdn.net/wuyoudeyuer/article/details/131472403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值