提高python處理數據的效率方法


處理大數據的方法有很多,目前我知道就這么多,后面會持續更新:

一、將數據分批次讀取

csv格式是常見的數據存儲方式,對於我們普通人而言易於讀寫。此外,在pandas中有pd.read_csv()函數可以將csv形式的數據進行讀取。但當csv文件非常大的時候,直接讀取會很吃內存,甚至會出現內存不夠用的情況。

這時候我們可以 分批次(分塊)讀取,而不是一次性讀取 這么大體量的數據。操作步驟:

  1. 分批次讀取
  2. 處理每一批次
  3. 保存每一批次的結果
  4. 對所有的數據重復步驟1-3
  5. 將所有的批次結果都結合起來

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

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)

  


 

二、常用方法讀取大型文件

面對100w行的大型數據,經過測試各種文件讀取方式,得出結論:

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

這種方式最快,100w行全遍歷2.7秒。

基本滿足中大型文件處理效率需求。如果rb改為r,慢6倍。但是此方式處理文件,fLine為bytes類型。但是python自行斷行,仍舊能很好的以行為單位處理讀取內容。

 


四、文本處理效率問題

這里舉例ascii定長文件,因為這個也並不是分隔符文件,所以打算采用列表操作實現數據分割。但是問題是處理20w條數據,時間急劇上升到12s。本以為是byte.decode增加了時間。遂去除decode全程bytes處理。但是發現效率還是很差。

最后用最簡單方式測試,首次運行,最簡單方式也要7.5秒100w次。

那么關於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當使用時只會調用值。

 


 五、Datatable:性能碾壓pandas的高效多線程數據處理庫

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM