【这是一猿小讲的第 34 篇原创分享】

1.

“一猿小讲”公众号的风格就是多元化,偶尔会真情吐露一下程序猿的内心;偶尔也结合自己的经历畅聊一些经验杂谈;其中也不乏幽默风趣的技术故事。分享是件快乐的事情,工作之余,有时间我就尽力多码字,多推几篇文章。其实讲真,我每次都是抱着分享给那些需要的人,说不定哪篇文章,就戳中了你,扣开了你的心扉,解决了你的困惑(捂嘴笑)。

好了,不扯啦,言归正传,不跑偏。请准备好小板凳,我们的分享开始。

2.

经常理财投资的都清楚,投资的产品周期大概分为 12 个月、24 个月、36 个月。记得上次在信用风险模型项目实现中,为了跑信用风险模型,按照业务要求,需要按照产品周期的维度进行数据逐条拆分、衍生、细化。

站在技术的视角,其实需要针对每条数据,统一执行一个函数,未曾想 Python 天然提供 apply 函数,当时也没管三七二十一,直接拿来主义上来就是用。但是程序跑起来,由于数据量大的原因,一个进程一条一条去执行数据。等输出结果,真是在线等的好着急,就这样程序跑了一整天,苦苦的等出来了结果,你可能不相信,我居然能忍受这么慢的程序,连我自己都不敢相信(捂嘴笑)。

不过当拿到跑出来的结果,却有点不尽人意,于是业务要求加大数据量。但是我的程序这么慢,如果加大数据量,程序跑起来,如果再死等程序的结果,到最后就只能变成了等死啦。

没法,只有技术可以治愈金融危机的创伤;只有技术才能让业务更美好;IT优化没有终点,极致体验没有尽头。那我只能再考虑如何优化一下代码,提升一下程序性能。再三思索,最后决定采取多进程的方式进行了调整。其实和吃包子是一样式的,想想一个人吃 10 个包子和 5 个人吃 10 个包子,那场面效果能一样吗?不过调整后的程序,运行效率确实大幅提升。

唯恐你们也再纠结此种问题,为了你们不再入坑,省出更多时间冲咖啡。作为一个负责任分享的我,岂能只截一张图给你们,还是从实际项目中简单抽取一个 demo 雏形出来,以备你们的不时之需。

if __name__ == '__main__':    # 把36期的数据按照50000条进行分割成小文件   step = split_36_months()   # 注意:采用多进程进行执行,不然真的会很慢呦   # 一个进程处理一个36期的小 csv 文件,进行按照6个月的维度进行细分    p = Pool() for i in range(1, step + 1):   p.apply_async(add_months_36_months, args=(i,)) print('等待所有36期数据处理的子进程执行完毕...')   p.close()   p.join()    print('所有36期数据处理的子进程执行完成')

然后定义 split_36_months 函数,完成大的 csv 文件拆分成小 csv 文件。

# 把36期的csv文件拆分成若干小文件
def split_36_months():  # TODO 把csv文件拆分成小文件 # TODO 统计拆分的小文件个数,这里假设拆分成为5个小文件 return 5

接着定义 add_months_36_months 函数,完成数据的业务处理(函数名不重要,函数名能起成这样,也是人才,不过这也不是一时的事情,是历史迭代,所以各位看官,莫纠结,莫纠结,莫纠结)。

# 36期的数据逐个以6个月的维度进行拆分
def add_months_36_months(step): print('step: {0} 进程ID:{1} 开始执行任务'.format(step, os.getpid()))   # TODO 针对每条数据执行apply函数  # chunk = chunk.apply(add_months, axis=1, periods=(36 + 1)) # print("step:{0}-{1}月份处理完成".format(step, count))  # chunk = chunk.apply(format_reserve_tm, axis=1)  # print("step:{0}-{1}开始格式化还款日期".format(step, count))   # TODO 把执行结果输出到csv文件中   print("step:{0} 进程ID: {1} 任务处理完毕".format(step, os.getpgid()))

代码码完了,真金不怕火炼,效果不怕检验,是骡子是马总要牵出来遛一遛。程序运行效果如预期所料,拆分成5个小文件,然后每个文件对应一个进程去完成业务数据处理,着实不错。

但是知其然,知其所以然,容我再多絮叨两句。

第一步:创建进程池。Python 中如果要启动大量的子进程,那么就可以用进程池的方式批量创建子进程。

p = Pool()  #默认进程数量是CPU的核数
p = Pool(5) #创建拥有5个进程数量的进程池

第二步:执行子进程。

p.apply_async(add_months_36_months, args=(i,))

第三步:告诉主进程,你等着所有子进程运行完毕后在运行剩余部分。

p.close() #关闭进程池
p.join() #等待所有工作进程退出

友情提示:对 Pool 对象调用 join() 方法会等待所有子进程执行完毕;调用 join() 之前必须先调用 close(),调用 close() 之后就不能继续添加新的 Process 了。

3.

好了,程序从慢到快的步骤只需要一步,那就是实现思路的转变。今天的分享就到这儿,希望对你有帮助。

推荐阅读:

玩弄日志归集于手掌之中

傻瓜也能玩转日志归集

机器学习如何为业务赋能?

妈妈再也不用担心,我学不会大数据 flink 啦

Java系列爱情故事推荐:

爱情36技之追美妹的技术

爱情36技之暗送秋波的技术

爱情36技之趣味相投

爱情36技之Bug大战

爱情36技之猿门授渔

爱情36技之记忆永存

程序慢的像蜗牛,我该怎么办?相关推荐

  1. 小程序实战 -- 仿网易蜗牛读书

    最近一段时间在学习怎么写小程序,然后自己利用课外时间,也撸了一个.一直都很喜欢网易蜗牛读书这款App,对于喜爱的事物总是情不自禁的,于是就仿照网易蜗牛读书的App简单做了这款小程序. 项目地址:杳杳飞 ...

  2. 第41课 蜗牛与葡萄树 《小学生C++趣味编程》

    /* 试编一程序,计算该蜗牛需要多少分钟才能爬到树顶. 树高:17分米 一步一步往上爬 每爬一分钟后休息1分钟 下滑1分米 */ #include<iostream> using name ...

  3. 编程精粹 --Microsoft编写优质无错C程序秘诀

    献给我的妻子Beth, 以及我的双亲Joseph和Julia Maguire ────为了他们的爱和支持 序 1986年,在为几家小公司咨询和工作了10年之后为了获得编写Macintosh应用程序的经 ...

  4. 如何成为Android高手

    要成为Android 高手并不是一件容易的事情.并不是很多人想象的 能够飞快的写出几行漂亮的代码去解决一些困难的问题 就是Android 高手了.真正的Android 高手需要考虑的问题远远不是写些漂 ...

  5. 如何成为Android高手--转载

    http://www.cnblogs.com/guoshiandroid/archive/2010/06/05/1752150.html 前言 本文pdf下载链接 配套视频连接 若立志成为Androi ...

  6. Android的优化

    1         General 1 编译release版本 2 除报错信息外,去除所有的打印信息,对于部分常规错误,也可以关闭打印信息 3 Config.java public static fi ...

  7. 定期总结,及时复盘,三省吾身。

    岁月蹉跎,时不我待.不知不觉,2020 年,上半年快过去啦. 今天,花几分钟,对这段时间分享的 100 多篇原创文章,进行整理,以便大家阅读,如果你错过一些精彩的文章,今天绝对是一个补票的好机会.点击 ...

  8. 如何成为Android高手 .转

    from http://www.cnblogs.com/guoshiandroid/archive/2010/06/05/1752150.html 前言 本文pdf下载链接 配套视频连接 若立志成为A ...

  9. 入门学习C++的一点讨论

    坛子里在讨论入门C++用IDE好还是命令行好,这里谈点我的看法. 一家之言,欢迎拍砖. 单就学习C++语言而言,建议初学者还是不要用IDE.原因很简单,IDE牵引性太强了.  比如VC吧,上来就建立工 ...

最新文章

  1. EcologyEvolution|微生物功能多样性从概念到应用
  2. js 对一个字段去重_JS单行、多行文本字符去重和行去重
  3. 对 SAP UI5 应用使用 uiveri5 执行测试的 ERR_CONNECTION_REFUSED 错误
  4. A Hierarchical Deep Temporal Model for Group Activity Recognition
  5. ai人工智能操控什么意思_为什么要建立AI分散式自治组织(AI DAO)
  6. 携程瘫痪非偶然 国内互联网企业漠视数据管理
  7. python第七章-文件和数据格式化
  8. Socket通信实例详解
  9. minicom - 友好易用的串口通信程序
  10. android 高光动画,分享AirDroid高光时刻:它是如何使我高效工作和生活的?
  11. jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式
  12. 使用云主机,我们可以做哪些事情
  13. 基本数据类型有哪些?
  14. charles 抓包修改app页面数据
  15. 通过修改hosts文件屏蔽网站的广告
  16. 远程桌面工具 mRemote
  17. PAT 乙级练习 1050 螺旋矩阵 - 超级详细的思路讲解
  18. Retrofit中关于CallAdapter使用的设计模式分析
  19. Ubuntu下利用Opencv进行点阵汉字的字模读取与显示
  20. 计算机软件著作权 (软著)申请流程

热门文章

  1. SDWebImage请求头需要加参数的坑!
  2. 图书查询系统的工作原理
  3. 【RS-M1系列 - 1】Windows下使用RSView查看点云
  4. 强化学习笔记(4)之蒙特卡洛法
  5. 浅谈如何做好软件研发团队的盘点
  6. 【华为OD机试真题 python】竖直四子棋【2022 Q4 | 200分】
  7. 2022年全球塑料阻隔层压管行业分析报告
  8. 【PR】零基础快速入门教程
  9. python主网站网址是_python网站主题
  10. 【运筹学】匈牙利法 ( 匈牙利法步骤 | 第一步 : 使行列出现 0 元素示例 )