csvstat比熊猫需要更长的运行时间

时间:2015-09-08 17:57:37

标签: python csv pandas command-line

我正在尝试获取csv(~10 GB)中特定列中的唯一值的数量,并且我正在寻找最快的方法。我希望像csvstat这样的命令行工具比熊猫运行得更快,但是:

def get_uniq_col_count(colname):
    df = pd.read_csv('faults_all_main_dp_1_joined__9-4-15.csv', engine='c', usecols=[colname], nrows = 400000)
    df.columns = ['col']
    return len(set(df.col.values)), list(set(df.col.values))

t1 = datetime.datetime.now()
count, uniq = get_uniq_col_count('model')
print(datetime.datetime.now() - t1)

# 0:00:04.386585

VS

$ time csvcut -c model faults_all_main_dp_1_joined__9-4-15.csv | head -n 400000 | csvstat --unique
3
real    1m3.343s
user    1m3.212s
sys     0m0.237s

(我正在做标题,因为我让csvstat在整个数据集上运行,出去吃午饭,回来,它仍然在运行。花了pandas 50秒完成。)

我想知道我做错了什么,总的来说,如果有办法加速这个过程。 (每列有大约500万行可以读取。)

1 个答案:

答案 0 :(得分:0)

这并不奇怪。 ' csvtools'完全用python编写,不使用任何优化技巧。特别是,' csvstat'将整个表读入内存并将其作为常规python列表存储多个副本。这会产生巨大的开销 - 包括内存和垃圾收集器时间。

另一方面,pandas使用numpy,这意味着整个列只使用了几个python对象,而且几乎没有内存开销。您可以通过使用特定于熊猫的独特方法(Find unique values in a Pandas dataframe, irrespective of row or column location

使程序稍快一些

如果您打算这么做,请将数据转换为更有效的格式。此页面:http://matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization/表示如果您将数据转换为HDF5,则加载速度会快得多。