提高单行熊猫read_csv的速度

时间:2019-05-21 18:30:07

标签: python pandas numpy

我正在满足延迟要求非常严格的API请求,并且我要转换的数据一次发布一次。我很困惑地看到pandas的read_csv方法需要2毫秒左右的时间,我不能仅仅为了加载数据而放弃。

下面的代码是否有进一步改进的可能,例如我缺少的一个参数,它将在这种数据量的情况下加快速度?

from io import StringIO
import pandas as pd
import numpy as np

example_input = '1969,EH10,consumer'

我可以找到的最佳优化的pandas库方法是使用以下参数:

%%timeit
s = StringIO(example_input)
df = pd.read_csv(s,
                 sep=',',
                 header=None,
                 engine='c',
                 names=['dob', 'postcode', 'contract'],
                 dtype=str,
                 compression=None,
                 na_filter=False,
                 low_memory=False)

在本地返回 1.75 ms ± 18.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

我能够通过numpy获得相当大的加速加载,然后创建一个数据框:

%%timeit
s = StringIO(example_input)
a = np.genfromtxt(s, delimiter=',', dtype=str)
df = pd.DataFrame(a.reshape(1, -1),
                  columns=['dob', 'postcode', 'contract'])

给出415 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each),对于我的应用程序来说更可接受。 (仅将它加载到一个numpy数组中就可以在大约70.4 µs内完成,而无需加载到数据帧中,所以我最终可能会用到它)

但是,是否可以进一步加快pd.read_csv示例的速度,如果不能,那么-有人可以帮助我了解此处大三角洲背后的原因吗?

1 个答案:

答案 0 :(得分:3)

通常我们看到pd.read_csvgenfromtxt快。但显然有一个启动时间,在这种情况下,这种情况占主导地位。

In [95]: example_input = '1969,EH10,consumer'                                
In [96]: np.genfromtxt([example_input], delimiter=',',dtype=str)             
Out[96]: array(['1969', 'EH10', 'consumer'], dtype='<U8')

但是为什么不只拆分字符串并从中创建一个数组呢?更直接,更快捷:

In [97]: np.array(example_input.split(','))                                  
Out[97]: array(['1969', 'EH10', 'consumer'], dtype='<U8')

从此数组制作数据帧需要更长的时间。

In [106]: timeit np.array(example_input.split(','))                          
2.89 µs ± 50.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [107]: timeit pd.DataFrame(np.array(example_input.split(','))[None,:], col
     ...: umns=['dob', 'postcode', 'contract'])                              
406 µs ± 6.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)