鱼C论坛

 找回密码
 立即注册
查看: 3532|回复: 11

想联动multiprocessing和pandas,但不知如何得到读取得到的df,请大佬求助

[复制链接]
发表于 2019-12-10 11:39:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
情况是这个样子的,最早自己写了一个把18张excel表(来自公司不同部门)自动计算并变成23张自己所需要数据的excel表
当时差不多要400s完成总运算。其中读取需要300多s。希望能够通过同时读取18张表来节省时间。
因为每个表读取的sheet_name,header,index_col等都有些不一样,所以想要每个单独写一个df并且最后能df1-df16一个个排好
但自己尝试找一个最简单的4号表,想要通过多进程的方式将其命名为df4就碰到了困难。自己也知道不应该用queue但暂时没思路该怎么办,求大佬指点
如何多进程直接把得到的东西放到一个表里面

import pandas as pd
import time
from multiprocessing import Process, Queue

df4 = pd.read_excel('数据源4维保人员.xlsx')


def df4_read(workbook, result_queue):
    df = pd.read_excel(workbook)
    result_queue.put(df4)

if __name__ == '__main__':
    result_queue = Queue()
    p1 = Process(target=df4_read, args=('数据源4维保人员.xlsx', result_queue))
    p1.start()
    p1.join()
    df4 = result_queue.get()
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-10 11:50:16 | 显示全部楼层

回帖奖励 +10 鱼币

  1. >>> for i in range(10):
  2.         locals()['a'+str(i)]=i

  3.        
  4. >>> a1
  5. 1
  6. >>> a2
  7. 2
  8. >>> a3
  9. 3
  10. >>>
复制代码

至于你要用什么参数,可以用args传过去就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 11:51:09 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-12-10 11:54 编辑

先回个贴,看有没有奖励
没有奖励,就顶一下贴吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-10 14:23:57 | 显示全部楼层
塔利班 发表于 2019-12-10 11:50
至于你要用什么参数,可以用args传过去就行了

大佬主要是想问df=read_excel(workbook)如何把这个df传回来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 15:36:54 | 显示全部楼层
思想不惧子弹 发表于 2019-12-10 14:23
大佬主要是想问df=read_excel(workbook)如何把这个df传回来

你把join那行删了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-10 19:01:45 | 显示全部楼层

join不是用来等待p1完成吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 19:15:14 | 显示全部楼层
思想不惧子弹 发表于 2019-12-10 19:01
join不是用来等待p1完成吗

是,但是你的get也会阻塞进程
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-10 23:08:42 | 显示全部楼层
塔利班 发表于 2019-12-10 19:15
是,但是你的get也会阻塞进程

拿大佬如果我不用队列的办法,
def df4_read(q1):
    df4 = pd.read_excel('数据源4维保人员.xlsx')
if __name__ == '__main__':
    p4 = Process(target=df4_read)
    p4.start()
    p4.join()

我怎么才能把df4设法让主进程里也得到?不然不知道该如何让16个表同时开始操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 09:44:20 | 显示全部楼层
你队列是主进程里定义的,主进程里get就行了,你可以但是你得控制好顺序,以免拿错,一般连表查这种性能需要数据库来实现,而不是通过表
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-11 13:39:06 | 显示全部楼层
塔利班 发表于 2019-12-11 09:44
你队列是主进程里定义的,主进程里get就行了,你可以但是你得控制好顺序,以免拿错,一般连表查这种性能需 ...

找到办法了,用multiprocessing里面的pool就能得到
还是谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 15:17:00 | 显示全部楼层
思想不惧子弹 发表于 2019-12-11 13:39
找到办法了,用multiprocessing里面的pool就能得到
还是谢谢啦

pool也没什么区别,不过是管理进程池而已,还是用Manager().Queue()的消息队列
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-12 14:16:23 | 显示全部楼层
塔利班 发表于 2019-12-11 15:17
pool也没什么区别,不过是管理进程池而已,还是用Manager().Queue()的消息队列

对了大佬请教一个问题
我想读取19个表格,分别用多进程和单进程写了程序。单进程就是一个个读取,多进程用Pool一起读取。但为什么单进程耗时365s。多进程不设置pool居然要370s,设置pool(19)也就349s。运行中感觉cpu没有被充分利用,怎么办

import pandas as pd
import time
from multiprocessing import Pool


def df_read(filename, header1=0, index_col1=None, sheet_name1=0):
    df = pd.read_excel(filename, header=header1, index_col=index_col1, sheet_name=sheet_name1)
    return df


if __name__ == '__main__':
    start = time.time()
    pool = Pool()
    df1 = pool.apply_async(df_read, ('数据源1台账.xlsx',)).get()
    df2 = pool.apply_async(df_read, ('数据源2财务报表.xlsx',), dict(sheet_name1='19统计报表明细', index_col1='项目')).get()
    df2ly = pool.apply_async(df_read, ('数据源2财务报表(去年).xlsx',), dict(sheet_name1='18统计报表明细', index_col1='项目')).get()
    df3 = pool.apply_async(df_read, ('数据源3维保站点.xlsx',)).get()
    df4 = pool.apply_async(df_read, ('数据源4维保人员.xlsx',)).get()
    df5 = pool.apply_async(df_read, ('数据源5远程监视.xlsx',)).get()
    df6 = pool.apply_async(df_read, ('数据源6急修工单.xlsx',)).get()
    df7 = pool.apply_async(df_read, ('数据源7用户满意度.xlsx',)).get()
    df8 = pool.apply_async(df_read, ('数据源8移动终端.xlsx',)).get()
    df9 = pool.apply_async(df_read, ('数据源9市场投放量.xlsx',), dict(header1=1)).get()
    df10 = pool.apply_async(df_read, ('数据源10指标.xlsx',), dict(sheet_name1='表6 - 总保养台数分解', header1=[1, 2])).get()
    df10a = pool.apply_async(df_read, ('数据源10指标.xlsx',), dict(sheet_name1='表15 - 保养收入毛利分解', header1=[1, 2])).get()
    df10b = pool.apply_async(df_read, ('数据源10指标.xlsx',), dict(sheet_name1='表20 - 备件收入毛利分解', header1=[1, 2])).get()
    df11 = pool.apply_async(df_read, ('数据源11应收账款.xlsx',), dict(header1=[1, 2])).get()
    df12 = pool.apply_async(df_read, ('数据源12保养经营情况.xlsx',), dict(header1=[2])).get()
    df13 = pool.apply_async(df_read, ('数据源13安装预留费用.xlsx',)).get()
    df14 = pool.apply_async(df_read, ('数据源14LEHY-MRL.xlsx',)).get()
    df15 = pool.apply_async(df_read, ('数据源15MESE.xlsx',)).get()
    df16 = pool.apply_async(df_read, ('数据源16LEHY-III.xlsx',)).get()
    pool.close()
    pool.join()
    end = time.time()
    print('多进程19张表耗时', int(end - start), 's', sep='')

    """
   
    df4 = pd.read_excel('数据源4维保人员.xlsx')
    df8 = pd.read_excel('数据源8移动终端.xlsx')
    df11 = pd.read_excel('数据源11应收账款.xlsx', header=[1, 2])
    # df1是数据源台账,df是每个数据可能的返回值,wb是所有程序所有列表的汇总表
    # df2是数据源2财务报表
    start = time.time()
    this_year = time.localtime(time.time()).tm_year  # this_year指的是2019
    this_year1 = this_year - 2000  # this_year指的是19
    this_year2 = this_year1 - 1  # this_year指的是18
    year1 = str(this_year1)
    year2 = str(this_year2)
   
    df2 = pd.read_excel('数据源2财务报表.xlsx', sheet_name=(year1 + '统计报表明细'), index_col='项目')
    df3 = pd.read_excel('数据源3维保站点.xlsx')
   
    df5 = pd.read_excel('数据源5远程监视.xlsx')
    df6 = pd.read_excel('数据源6急修工单.xlsx')
    df7 = pd.read_excel('数据源7用户满意度.xlsx')
   
    df9 = pd.read_excel('数据源9市场投放量.xlsx', header=1)
    df10 = pd.read_excel('数据源10指标.xlsx', sheet_name='表6 - 总保养台数分解', header=[1, 2])
    df10a = pd.read_excel('数据源10指标.xlsx', sheet_name='表15 - 保养收入毛利分解', header=[1, 2])
    df10b = pd.read_excel('数据源10指标.xlsx', sheet_name='表20 - 备件收入毛利分解', header=[1, 2])
   
    df12 = pd.read_excel('数据源12保养经营情况.xlsx', header=[2])
    df13 = pd.read_excel('数据源13安装预留费用.xlsx')
    df14 = pd.read_excel('数据源14LEHY-MRL.xlsx')
    df15 = pd.read_excel('数据源15MESE.xlsx')
    df16 = pd.read_excel('数据源16LEHY-III.xlsx')
    end = time.time()
    print('单进程读取耗时', (end - start), 's', sep='')
    """
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-21 07:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表