当前位置:   article > 正文

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

pandas threading

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()  #等待进程池里面的进程运行完
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

使用时遇见的小问题:在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 !")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Pandas多进程

1.在apply前加swifter

import swifter
df.swifter.apply(XXXXX)
  • 1
  • 2

2.pandarallel

from pandarallel import pandarallel

pandarallel.initialize(nb_workers=20)#nb_workers=进程数
df.parallel_apply(xxxxx)
  • 1
  • 2
  • 3
  • 4

嵌套循环改多进程案例

修改前:

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

修改后:

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

#参考文献
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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号