提升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的高效多線程數據處理庫

相關文章
相關標籤/搜索