前言
最近在公司实习,给整了个活,像是数学建模一样的数据分析的活,目标是在几个互相有关联的大表中找出满足某条件的那些业务,其中第一步就是把两个表拼起来,就叫它们A和B吧,省略拼表过程中需要的逻辑判断。
串行
两个长为M和N的表,在判断中需要一个M*N级别的判断,也就是N2的复杂度,当M和N都很大时,比如3w,那还是得花点时间的,比如七八分钟。所以得想办法加速。
使用concurrent.futures的线程池
既然是在一个py进程里干的活,那自然就想到能不能多开几个线程,比如12个,反正每个判断是独立的,把一个表尽量平均拆成12份,让每个线程去做那一份的判断,最后再把结果返回给主进程进行拼接。这里我先使用了Python的concurrent.futures的线程池来看看效果。
concurrent.futures
是 Python 的一个模块,它提供了一个高级接口,用于异步执行可调用对象,也可以理解为并发。异步执行可以使用线程(使用 ThreadPoolExecutor
)或单独的进程(使用 ProcessPoolExecutor
)来执行。两者都实现了相同的接口,由抽象的 Executor
类定义 。
一个大致的使用框架:
import pandas as pd
import concurrent.futures
def sub_process(data: list) -> list:
res = []
# 处理
return res
df = pd.read_csv('large_data.csv')
num_threads = 12
chunk_size = len(df) // num_threads
results