我正在满足延迟要求非常严格的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
示例的速度,如果不能,那么-有人可以帮助我了解此处大三角洲背后的原因吗?
答案 0 :(得分:3)
通常我们看到pd.read_csv
比genfromtxt
快。但显然有一个启动时间,在这种情况下,这种情况占主导地位。
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)