提升python处理数据的效率方法

处理大数据的方法有不少,目前我知道就这么多,后面会持续更新:python

1、将数据分批次读取

csv格式是常见的数据存储方式,对于咱们普通人而言易于读写。此外,在pandas中有pd.read_csv()函数能够将csv形式的数据进行读取。但当csv文件很是大的时候,直接读取会很吃内存,甚至会出现内存不够用的状况。网络

这时候咱们能够 分批次(分块)读取,而不是一次性读取 这么大致量的数据。操做步骤:多线程

  1. 分批次读取
  2. 处理每一批次
  3. 保存每一批次的结果
  4. 对全部的数据重复步骤1-3
  5. 将全部的批次结果都结合起来

pd.read_csv(chunksize) 中的chunksize指的的是每一批次的行数app

import pandas as pd	
chunk_iterator = pd.read_csv("test.vcf",sep="\t", chunksize=10000)	
chunk_result_list = []	
#每一批次都是dataframe类型	
for chunk in chunk_iterator:	
    #根据你的分析问题,设计本身的chunk_manipulate函数	
    filter_result = chunk_manipulate(chunk)	
    chunk_result_list.append(filter_result)	
#合并全部批次处理结果,造成新的dataframe	
df = pd.concat(chunk_result_list)

  


 

2、经常使用方法读取大型文件

面对100w行的大型数据,通过测试各类文件读取方式,得出结论:函数

with open(filename,"rb") as f:
  for fLine in f:
  pass

这种方式最快,100w行全遍历2.7秒。性能

基本知足中大型文件处理效率需求。若是rb改成r,慢6倍。可是此方式处理文件,fLine为bytes类型。可是python自行断行,仍旧能很好的以行为单位处理读取内容。测试

 


4、文本处理效率问题

这里举例ascii定长文件,由于这个也并非分隔符文件,因此打算采用列表操做实现数据分割。可是问题是处理20w条数据,时间急剧上升到12s。本觉得是byte.decode增长了时间。遂去除decode全程bytes处理。可是发现效率仍是不好。大数据

最后用最简单方式测试,首次运行,最简单方式也要7.5秒100w次。spa

那么关于python处理大文件的技巧,从网络整理三点:列表、文件属性、字典三个点来看看。线程

1.列表处理

def fun(x):  尽可能选择集合、字典数据类型,千万不要选择列表,列表的查询速度会超级慢,一样的,在已经使用集合或字典的状况下,不要再转化成列表进行操做,好比:

values_count = 0
# 不要用这种的
if values in dict.values():
  values_count += 1
# 尽可能用这种的
if keys,values in dict:
  values_count += 1

后者的速度会比前者快好多好多。

2. 对于文件属性

若是遇到某个文件,其中有属性相同的,但又不能进行去重操做,没有办法使用集合或字典时,能够增长属性,好比将原数据从新映射出一列计数属性,让每一条属性具备惟一性,从而能够用字典或集合处理:

return '(' + str(x) + ', 1)'
list(map(fun,[1,2,3]))

使用map函数将多个相同属性增长不一样项。

3. 对于字典

多使用iteritems()少使用items(),iteritems()返回迭代器:

>>> d = {'a':1,'b':2}
>>> for i in d.items() :
.... print i
('a',1)
('b',2)
>>> for k,v in d.iteritems() :
... print k,v
('a',1)
('b',2)

字典的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator,items当使用时会调用整个列表 iteritems当使用时只会调用值。

 


 5、Datatable:性能碾压pandas的高效多线程数据处理库

相关文章
相关标签/搜索