使用Python做数据处理时,常用的读取/加载文件txt方法有以下几种:

  1. numpy.loadtxt()方法
  2. pandas.read_csv()方法
  3. open文件方法

以前处理几K或几M的小数据集时,通常习惯使用第一种方法,没有发现有何问题。但今天突然发现,当处理数据samples个数有约38万、浮点类型、文件大小约20M的大型数据时,在内存足够的前提下,发现在Spyder中需要加载很久很久……于是寻找并对比了其他加载文件的改进方法,发现pandas.read_csv()方法及open方法都比numpy.loadtxt()方法的快了一个数量级。另外,由于文件操作涉及加载mat文件,顺便把scipy.io中的loadmat()方法拿过来对比了一下。

测试代码如下:

import datetime 
import numpy as np
import scipy.io as scio
import pandas as pd

# loadtxt
start = datetime.datetime.now()
np_data = np.loadtxt('big_data.txt') 
stop = datetime.datetime.now()
print(stop-start)

# read_csv
start = datetime.datetime.now()
pd_data = pd.read_csv('big_data.txt')
stop = datetime.datetime.now()
print(stop-start)

# open
start = datetime.datetime.now()
a = open('big_data.txt', 'r')
open_data= np.array(a.readlines())
a.close()
stop = datetime.datetime.now()
print(stop-start)

# loadmat
start = datetime.datetime.now()
mat_dict = scio.loadmat('big_data.mat')
mat_data = mat_dict['v0']
stop = datetime.datetime.now()
print(stop-start)

可见,在不考虑成百上千G\TB级别的大数据的前提下(此时大概率需要考虑大数据储存和分析手段去解决,涉及到诸如Spark、Hadoop、分布式等技术,不在讨论之列),几种方式读取文件的操作代码行数差不多,无非可能多一步list、dataframe、array间的互转操作而已,因此对于一般的数据分析够用。

基于上述代码和数据的测试结果(时间消耗)如下:

0:00:12.513535
0:00:00.525636
0:00:01.146893
0:00:00.177526

显然,在数据量大小一样的前提下,以耗时降序排列:

  • numpy的loadtxt方法最慢,用时约12.5s。
  • open文件的方法稍快,用时约1.1s。
  • pandas的read_csv方法更快,用时约0.5s。
  • scipy.io的loadmat方法最快,用时约0.2s。

因此,数据量达到20M、30万个samples的级别的txt格式文件时:

  • 需要避免使用loadtxt方法,推荐使用pandas的read_csv而不用转换文件格式。
  • 在数据源头,可以考虑将数据存为mat格式文件(比如我经常用python处理其他人提供的matlab生成的mat文件)。

最后,再次说明:以上仅仅是对20M级别的数据,在Spyder IDE环境下做的时间消耗的简单对比,可能不适用其他环境或大数据情形下。

 

更多推荐

Python读取txt文件方法的速度对比和改进方案