热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python多线程与单线程处理大文件的性能差异【附图】

今天写了一段Python多线程处理文件的代码,用以比较单线程和多线程在处理较大文件时的速度差异代码解释:1-3行:导入需要用到的模块os,

今天写了一段Python多线程处理文件的代码,用以比较单线程和多线程在处理较大文件时的速度差异

代码解释:

1-3行:导入需要用到的模块os,threading,ctime

4-11行:从列表list中取得文件名,并计算出该文件的行数

15-22行:取得当前工作路径下的所有文件,并从中筛选出txt文件

28-33行:创建线程

34-35行:调用start()函数,一起启动线程:同步性

注意:在读取文件的时候,我没有使用read分批读入,而是使用readlines,所有运行的时候,可能会比较卡,读者也可以修改下代码的第9行

单线程和多线程处理较大文件的速度对比:

每个文本文件的行数大约都在100万行左右,通过以上的对比,我们从中就能很明显的发现多线程处理大文件的优势所在

代码如下:

1 import os
2 import threading
3 from time import ctime
4 def loop(loops,list):#list存放着每个线程需要处理的文本文件名
5 print '线程%d处理的文件列表%s\n'%(loops+1,list)
6 list_len=len(list)
7 for i in range(list_len):
8 f=open(list[i])
9 rows=len(f.readlines())#此处,我直接将整个文件读入,所以会比较卡,可以在此设置每次读入的大小
10 f.close()
11 print '文件%s__%d行\n'%(list[i],rows)
12
13 def main():
14 print 'all start at:',ctime()
15 cwd=os.getcwd()
16 dir_list=os.listdir(cwd)
17 file_list=[] #该列表用来存放当前目录下的所有txt文件
18 print '当前文件夹下的所有txt文件:'
19 for l in dir_list:
20 if l.rfind('txt')>=0:
21 print ' ',l
22 file_list.append(l)
23 threads=[]
24 threads_num=4 #线程数 在此处修改下线程数就可以比较多线程与单线程处理文件的速度差异
25 print '共有线程数:%d个'%threads_num
26 per_thread=len(file_list)/threads_num #每个线程处理的文本数量
27 print per_thread
28 for i in range(threads_num):
29 if threads_num-i==1: #最后一个线程,分担余下的所有工作量
30 t=threading.Thread(target=loop,args=(i,file_list[i*per_thread:]))
31 else:
32 t=threading.Thread(target=loop,args=(i,file_list[i*per_thread:i*per_thread+per_thread]))
33 threads.append(t)
34 for i in range(threads_num):
35 threads[i].start()
36 for i in range(threads_num):#等待所有的线程结束
37 threads[i].join()
38 print 'all end at:',ctime()
39 if __name__=='__main__':
40 main()


原创文章:WEB开发_小飞

转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/04/14/python-multithread-document.html


推荐阅读
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文介绍了如何利用Python中的Matplotlib库来绘制三维点云数据,并展示其外接的最大边界框。通过具体代码示例,帮助读者理解点云数据的可视化方法。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 本文探讨了如何在Python中将具有相同值的元素分组到矩阵中,这是一个在数据分析和处理中常见的需求。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文将详细介绍如何使用Java编程语言生成指定数量的不重复随机数,包括具体的实现方法和代码示例。适合初学者和有一定基础的开发者参考。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 本文详细介绍了Sleep函数的基本概念、使用方法及其背后的实现原理。适合对Sleep函数的使用和实现感兴趣的开发者阅读。通过本文,您将了解如何在不同操作系统中使用Sleep函数,以及其在多线程编程中的重要性。 ... [详细]
author-avatar
袁冠和堂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有