Python基础:多进程multiprocessing与多线程threading 是什么 怎么选 怎么用?以及Pandas提速的几种方法。

1.多线程与多进程

1.1 是什么?

多线程用一个CPU跑多个线程;
多进程用多个CPU跑,每个CPU跑一个线程。

1.2 怎么选?

计算密集用多进程,IO密集用多线程。

2. 怎么用?

2.1 多进程

from multiprocessing import Pool #多进程
 
arr1 = [1,3123,521,123,12321,77,116]
def test_func(i):
    #测试使用的函数
    while True:
        i=i*i

pool = Pool(5)# 开5个进程,没有参数时默认是 cpu 的核心数

results = pool.map(test_func, arr1)# 在进程中执行 test_func
pool.close() #需要关闭进程池,防止池其他任务的提交,注意!这里不是关闭进程。简单来说就是关掉了屋外的大门,但是各个房间在运行。
pool.join()  #等待进程池里面的进程运行完

使用时遇见的小问题:在win10电脑jupyter开不了多进程(求解),直接运行py文件就可以;在linux上jupyter可以多进程。

2.2 多线程

from threading import Thread #多线程
 
arr1 = [1,3123,521,123,12321,77,116]
def test_func(i):
    #测试使用的函数
    print(i)

ts = []
 
for i in range(15):
    # target指定线程要执行的代码,args指定该代码的参数
    th = threading.Thread(target=test_func, args=(i,))
    ts.append(th)
    
#开炮
for i in ts:
    i.start()
    
# 此处的join函数使子线程全部跑完再继续往下跑子线程
for i in ts:
    i.join()
 
print("it is end !")

Pandas多进程

1.在apply前加swifter

import swifter
df.swifter.apply(XXXXX)

2.pandarallel

from pandarallel import pandarallel

pandarallel.initialize(nb_workers=20)#nb_workers=进程数
df.parallel_apply(xxxxx)

嵌套循环改多进程案例

修改前:

from collections import defaultdict
from tqdm.notebook import tqdm

pmid_relations=defaultdict(set)
for pmid,EntitySet in tqdm(pmid_EntitySet.items(),total=len(pmid_EntitySet)):
    for relation,RelationId in DiseaseGene_RelationId.items():
        if set(relation).issubset(EntitySet):
            pmid_relations[pmid].add((relation,RelationId))

修改后:

from multiprocessing import Pool
from collections import defaultdict
from tqdm.notebook import tqdm

def process(pmid_EntitySet_item):
    pmid, EntitySet = pmid_EntitySet_item
    relations = set()
    for relation, re_id in DiseaseGene_RelationId.items():
        if set(relation).issubset(EntitySet):
            relations.add((relation, re_id))
    return pmid, relations

pmid_relations = defaultdict(set)
with Pool() as pool:
    for pmid, relations in tqdm(pool.imap_unordered(process, pmid_EntitySet.items()), total=len(pmid_EntitySet)):
        pmid_relations[pmid] = relations

#参考文献
1.【Python】使用 multiprocessing.dummy 执行多线程任务https://blog.csdn.net/ns2250225/article/details/48755741
2. python3多进程阻塞与非阻塞快速理解https://blog.csdn.net/qq_41562377/article/details/105219269
3. Python多线程:Threading中join()函数的理解https://blog.csdn.net/xinghen1993/article/details/100691562

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值