Python大文件解析的效率问题
论坛求助与自行摸索相结合,基本解决python大文件解析效率问题。现将过程与结论存档,供有需要者参考。
=================前言====================
看着python很火,就跑到python怀抱蹭蹭,list,dict的普通化应用,让很多编程简便了很多。
感觉还不错,就开始着手写了个常用程序,磕磕碰碰的写完。却发现大型文件处理有严重的效率问题,只好到论坛找高手。
貌似python在csdn的论坛也不火,主要靠管理员wn0112 一直帮忙互相印证改进。折腾来折腾去,效率提升仍旧不是数量级层次。
就在快要放弃,准备用c写模块来实现基础解析功能的时候,看到网上一个用法,灵机一现,总算是解决了。
结果来之不易,多啰嗦几句,感慨感慨。各位看官休怪。
=================结论=======================
环境以下没注明的情况下,python采用python.org的3.6.1版本,机器AMD AthlonII x3 450- *, win10
在讨论过程中发现,几个简单结论,
- python的运行速度,受电脑软硬件的影响,差不多有1倍左右的差距。【I7 5500U 2.40G vs AMD Athlon II x3 450-*】【win7 vs win10】【2.7 vs 3.5】由于别人也忙,我手头上也没多少高大上的机器,没有深入。不过告诉我们一个思路,如果有时候效率只是1倍左右的差距,可以考虑升级升级硬件,o(^▽^)o
- python的循环效率还是蛮低的,没事不要用循环。只做个J+=1,循环1200w次,也要1.5秒。多做一个K+=1要3秒。
- 如果发现有效率问题,能优化算法,优化算法。算法也没法优化,就找模块,找函数。
with open(filename,"rb") as f:for fLine in f:pass
rb方式最快,100w行全遍历2.7秒。基本能满足中大型文件处理效率需求。如果rb改为r,慢6倍。
for lineNum, fline in enumerate(f) :
如果建立索引,以便后续查找定位,不建议使用传统win编程的行号定位。最好记录偏移量来进行定位。
import itertools
for lineNum, fline in itertools.dropwhile(lambda x:x[0] < 1073109, enumerate(f)) :
重新定位的效率会高很多很多。
文本处理,一般分为分隔符处理,定长处理。其实就是看重python3.x系列将string固化为unicode字符串,其他使用bytes类型。不是经常处理ascII,unicode不知道这种改进是多好。这也是抛弃2.7直接学3.x的原因。分隔符有各种split函数,我就不多说了。这里说定长文件。定长有unicode定长,与ascII定长。我处理的是ascii定长方式。以MS系编程经验,全bytes处理,效率最高。所以全用bytes不转换string处理。结果效率堪忧。解析20w行数据,直接上升到12s,已经成为性能瓶颈。开始使用最简单的循环拆解解析数据,100w行解析20个域,最低只能压倒5秒。用正则压倒3.5秒【如果i7机器,貌似简单循环也能压到3秒】。效率仍旧不满意。在即将放弃,准备用c重写处理函数自制模块方式提升效率,看c与python类型转换的时候,看到个函数。终于完美解决。代码如下:import re import time import structa="张abcdefghijklabcdefghijk" a="000000001111000002222222233333333000000004444444QAZ55555555000000006666666ABC这些事中文字 " ab=a.encode("GBK") aw=(2,3,2,2,2,2,2,2,2,2,2,2) aw=(12,9,4,8,15,3,8,15,3,80,200,15)awf=" ".join(map(lambda x:str(x)+"s",aw))print(awf)def tt5(argN,argByte):#struck return struct.unpack(argN, argByte) def test5(arg1):ticks=time.clock()for x in range(arg1):trs=tt5(awf, ab)print("test4共计有%d次,耗时%16.6f秒"%(arg1,time.clock()-ticks))print("结果=",trs) test5(1000000)
struct模块一般用来通信转换为字节流之用,用在此处,100w行解析20个域,可以压在1秒【i7暂时不知道能快多少】基本满足需求。
unicode定长方式,我处理这么久很少见到。可以考虑啃啃python3.x的string模块。实在不行用正则,100w行3.5秒,也可以接受。注意:re模块,如果处理bytes,那么patterns必须是bytes。如果处理string,那么patterns必须是stringcsdn的python论坛,人太少。如果python实在有问题,还是找个python人多的论坛吧。
==================过程========================
Python大文件解析的效率问题相关推荐
- linux大文件拷贝,Linux如何提高大文件的拷贝效率
Linux系统操作中,当你在进行机器直接的拷贝时,遇到大文件的时候非常浪费时间,特别是将文件同时拷贝到多台机器上的时候,那么有什么好的方法能够提高大文件的拷贝效率呢?一起来学习下吧. 你可以从源机器逐 ...
- python大文件排序_Python如何实现大文件排序?Python大文件排序的实现方法
Python如何实现大文件排序?Python大文件排序的实现方法 本文实例讲述了Python实现大文件排序的方法.分享给大家供大家参考.具体实现方法如下: import gzip import os ...
- python pyc文件解析_如何反编译pyc文件
如何将.pyc和.pyo文件反编译为.py文件 pyc大约在python2刚出的时候有.后来就很少找得到了.有一次,不小心把.py删除了,通过pyc还把代码还原了. 你搜索uncompyle2, de ...
- python怎么读文件后删去空格以行为单位进行排序-python 大文件以行为单位读取方式比对...
先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...
- python下载大文件-python 大文件
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 大文件上传服务一.前端(http:fex.baidu.comwebuploade ...
- python 大文件以行为单位读取方式比对
先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. http://stackoverflow.com/questions/800 ...
- python 大文件分片上传_Python实现大文件分片上传
转载请注明出处:http://blog.csdn.net/jinixin/article/details/77545140 引言想借着这篇文章简要谈谈WebUploader大文件上传与Python结合 ...
- 科研日志--python大文件打开内存溢出
关于python运行大文件导致死机的问题 最近因为科研需要,需要打开一个巨大的txt文件.借鉴了Python读取大文件的行数中的代码片段,成功按行读取了大小为5.6GB的.txt文件.但最终因为所设置 ...
- python pyc文件解析_pyc文件
code object¶ 在我们导入 python 脚本时在目录下会生成个一个相应的 pyc 文件,是pythoncodeobj的持久化储存形式,加速下一次的装载. 文件结构¶ pyc文件由三大部 ...
最新文章
- 创建在“system.net/defaultProxy”配置节中指定的 Web 代理时出错。
- 检查Java中的字符串是空还是空[重复]
- php论坛怎么架设,论坛架设有诀窍 phpWind配置技巧三则
- 获取activemq 队列所有数据_ActiveMQ的应用
- 智能音箱,你在窃听我吗?
- Java基础知识梳理(五)从源码了解字符串
- SpringMVC源码总结(八)类型转换PropertyEditor的背后
- iOS 给测试人员测试手机APP的四种方法:真机运行(略),打ipa包,(testFlighe)邮件,蒲公英(二)testflight
- Linux终端快捷键的使用
- ubuntu linux 郑码,如何输入间隔号 - dengyz的个人页面 - OSCHINA - 中文开源技术交流社区...
- 射频天线设计-窄带阻抗匹配电路设计
- unity屏幕分辨率设置
- 一个中高级PHP工程师所应该具备的能力
- APP - 重磅消息!微信测试无需新手机号注册新微信号功能
- colab上装在谷歌网盘
- RP网页设计中的默认字体:{font: 12px/1.5 Tahoma, Helvetica, Arial, sans-serif;}
- 19湖大考研经验总结
- 五金与机械行业的WMS系统方案
- onload js函数不执行的原因分析及解决方法
- 信贷风险指标你都懂吗?
热门文章
- 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
- 实况足球11 PES2008发布了!!!
- 【图像处理】图像拼接原理介绍
- WPS 2019 去除自动升级 和 广告、及优化的点
- 推荐一个快速获取时间的插件 Moment.js
- HTML JS获取当前页面URL
- 我的世界hmcl启动器登录教程
- 前端无法反序列化START\u数组标记-JSONCannot deserialize instance of `java.lang.String` out of START_ARRAY toke
- IDEA常用快捷键及模板
- 自动视觉锁螺丝机及其控制系统