论坛求助与自行摸索相结合,基本解决python大文件解析效率问题。现将过程与结论存档,供有需要者参考。

=================前言====================

看着python很火,就跑到python怀抱蹭蹭,list,dict的普通化应用,让很多编程简便了很多。

感觉还不错,就开始着手写了个常用程序,磕磕碰碰的写完。却发现大型文件处理有严重的效率问题,只好到论坛找高手。

貌似python在csdn的论坛也不火,主要靠管理员wn0112 一直帮忙互相印证改进。折腾来折腾去,效率提升仍旧不是数量级层次。

就在快要放弃,准备用c写模块来实现基础解析功能的时候,看到网上一个用法,灵机一现,总算是解决了。

结果来之不易,多啰嗦几句,感慨感慨。各位看官休怪。

=================结论=======================

环境以下没注明的情况下,python采用python.org的3.6.1版本,机器AMD AthlonII x3 450- *, win10

在讨论过程中发现,几个简单结论,

  1. python的运行速度,受电脑软硬件的影响,差不多有1倍左右的差距。【I7 5500U 2.40G vs AMD Athlon II x3 450-*】【win7 vs win10】【2.7 vs 3.5】由于别人也忙,我手头上也没多少高大上的机器,没有深入。不过告诉我们一个思路,如果有时候效率只是1倍左右的差距,可以考虑升级升级硬件,o(^▽^)o
  2. python的循环效率还是蛮低的,没事不要用循环。只做个J+=1,循环1200w次,也要1.5秒。多做一个K+=1要3秒。
  3. 如果发现有效率问题,能优化算法,优化算法。算法也没法优化,就找模块,找函数。
一、大型文件的读取效率
面对100w行的大型数据
with open(filename,"rb") as f:for fLine in f:pass

rb方式最快,100w行全遍历2.7秒。基本能满足中大型文件处理效率需求。如果rb改为r,慢6倍。

虽然此方式处理文件,fLine为bytes类型,但是python自动断行,仍旧能很好的以行为单位处理读取内容。
如果需要获取行号,则使用:
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必须是string
csdn的python论坛,人太少。如果python实在有问题,还是找个python人多的论坛吧。

==================过程========================
辛苦了好几天,想了n个方法优化。那是一堆的血泪啊。本想叨叨。
一看,尼玛,过程好多。估计大家也不想看。算了,不说了:)

Python大文件解析的效率问题相关推荐

  1. linux大文件拷贝,Linux如何提高大文件的拷贝效率

    Linux系统操作中,当你在进行机器直接的拷贝时,遇到大文件的时候非常浪费时间,特别是将文件同时拷贝到多台机器上的时候,那么有什么好的方法能够提高大文件的拷贝效率呢?一起来学习下吧. 你可以从源机器逐 ...

  2. python大文件排序_Python如何实现大文件排序?Python大文件排序的实现方法

    Python如何实现大文件排序?Python大文件排序的实现方法 本文实例讲述了Python实现大文件排序的方法.分享给大家供大家参考.具体实现方法如下: import gzip import os ...

  3. python pyc文件解析_如何反编译pyc文件

    如何将.pyc和.pyo文件反编译为.py文件 pyc大约在python2刚出的时候有.后来就很少找得到了.有一次,不小心把.py删除了,通过pyc还把代码还原了. 你搜索uncompyle2, de ...

  4. python怎么读文件后删去空格以行为单位进行排序-python 大文件以行为单位读取方式比对...

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

  5. python下载大文件-python 大文件

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 大文件上传服务一.前端(http:fex.baidu.comwebuploade ...

  6. python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. http://stackoverflow.com/questions/800 ...

  7. python 大文件分片上传_Python实现大文件分片上传

    转载请注明出处:http://blog.csdn.net/jinixin/article/details/77545140 引言想借着这篇文章简要谈谈WebUploader大文件上传与Python结合 ...

  8. 科研日志--python大文件打开内存溢出

    关于python运行大文件导致死机的问题 最近因为科研需要,需要打开一个巨大的txt文件.借鉴了Python读取大文件的行数中的代码片段,成功按行读取了大小为5.6GB的.txt文件.但最终因为所设置 ...

  9. python pyc文件解析_pyc文件

     code object¶ 在我们导入 python 脚本时在目录下会生成个一个相应的 pyc 文件,是pythoncodeobj的持久化储存形式,加速下一次的装载. 文件结构¶ pyc文件由三大部 ...

最新文章

  1. 创建在“system.net/defaultProxy”配置节中指定的 Web 代理时出错。
  2. 检查Java中的字符串是空还是空[重复]
  3. php论坛怎么架设,论坛架设有诀窍 phpWind配置技巧三则
  4. 获取activemq 队列所有数据_ActiveMQ的应用
  5. 智能音箱,你在窃听我吗?
  6. Java基础知识梳理(五)从源码了解字符串
  7. SpringMVC源码总结(八)类型转换PropertyEditor的背后
  8. iOS 给测试人员测试手机APP的四种方法:真机运行(略),打ipa包,(testFlighe)邮件,蒲公英(二)testflight
  9. Linux终端快捷键的使用
  10. ubuntu linux 郑码,如何输入间隔号 - dengyz的个人页面 - OSCHINA - 中文开源技术交流社区...
  11. 射频天线设计-窄带阻抗匹配电路设计
  12. unity屏幕分辨率设置
  13. 一个中高级PHP工程师所应该具备的能力
  14. APP - 重磅消息!微信测试无需新手机号注册新微信号功能
  15. colab上装在谷歌网盘
  16. RP网页设计中的默认字体:{font: 12px/1.5 Tahoma, Helvetica, Arial, sans-serif;}
  17. 19湖大考研经验总结
  18. 五金与机械行业的WMS系统方案
  19. onload js函数不执行的原因分析及解决方法
  20. 信贷风险指标你都懂吗?

热门文章

  1. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
  2. 实况足球11 PES2008发布了!!!
  3. 【图像处理】图像拼接原理介绍
  4. WPS 2019 去除自动升级 和 广告、及优化的点
  5. 推荐一个快速获取时间的插件 Moment.js
  6. HTML JS获取当前页面URL
  7. 我的世界hmcl启动器登录教程
  8. 前端无法反序列化START\u数组标记-JSONCannot deserialize instance of `java.lang.String` out of START_ARRAY toke
  9. IDEA常用快捷键及模板
  10. 自动视觉锁螺丝机及其控制系统