Python 多进程处理Pandas

1 怎么多进程处理

比如,对于一个pd.DataFrame 数据,需要对其中的每一行进行一个gen_new_df操作,然后将所有的结果拼接起来。

import pandas as pd
import multiprocessing as mp
import numpy as np
# test_df: 你要处理的数据
# pro_count: 进程数量
test_df_split = np.array_split(test_df, pro_count)
pool = mp.Pool(pro_count)
df = pd.concat(pool.map(gen_new_df, test_df_split))
pool.close()
pool.join()

2 实例

2.1 生成测试数据:

import pandas as pd
from faker import Faker
from datetime import datetime

fake = Faker()
n = 10000

# 生成随机的名字和时间戳
name_data = [fake.name() for _ in range(n)]  # 生成随机名字
timestamp = [datetime.now().strftime('%Y-%m-%d %H:%M:%S') for _ in range(n)]  # 生成时间戳

# 创建DataFrame
df = pd.DataFrame({"Name": name_data, "Time": timestamp})

# 将DataFrame保存为CSV文件
df.to_csv("test.csv", index=False)

2.2 定义处理函数:

比如我们这里,让1行变成5行

def gen_new_df(input_df):
    new_df = pd.DataFrame(columns=['Name', 'Time', 'uuid', 'index'])
    for i in range(len(input_df)):
        input_dic = input_df.iloc[i].to_dict()
        for j in range(5):
            new_dic = {
                "Name": input_dic["Name"],
                "Time": input_dic["Time"],
                "uuid": str(uuid.uuid4()),
                "index": str(j)
            }
            new_df = pd.concat([new_df, pd.DataFrame([new_dic])], ignore_index=True)
    return new_df

2.3 多进程处理

可以先查看我们的CPU核数:

import multiprocessing as mp
num_cores = mp.cpu_count()
print(num_cores)

用不同的进程数量来处理:

if __name__ == '__main__':
    # 用不同的进程数量进行测试
    test_pro_count = [1, 2, 4, 7, 8, 9, 10, 15, 20, 25, 30]
    test_df = pd.read_csv("test.csv")
    time_con_list = []

    begin_time = time.time()
    gen_new_df(test_df)
    time_con = time.time() - begin_time
    print("不使用多进程: ", "---", time_con)

    time_consume = []
    for pro_count in test_pro_count:
        begin_time = time.time()
        test_df_split = np.array_split(test_df, pro_count)
        pool = mp.Pool(pro_count)

        df = pd.concat(pool.map(gen_new_df, test_df_split))
        pool.close()
        pool.join()

        time_con = time.time() - begin_time
        time_con_list.append(time_con)
        print("进程数量:", pro_count, "消耗时间: ", time_con)
    print(time_con_list)

3 效率分析

进程数量 --- 消耗时间
0 --- 27.70097780227661
1 --- 28.131190061569214
2 --- 9.749696016311646
4 --- 4.519064903259277
7 --- 2.705703020095825
8 --- 2.702981948852539
9 --- 3.6096010208129883
10 --- 2.7417500019073486
15 --- 4.223258018493652
20 --- 3.8286550045013428
25 --- 5.2411949634552
30 --- 6.33648681640625
测试结果.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容