[英]Increase speed of pandas read_csv for single row
我正在提供具有相当严格的延迟要求的API请求,并且我想要转换的数据一次发布一行。 我很困惑地看到pandas read_csv方法需要大约2ms,我不能放弃只是为了加载数据。
以下代码是否可以进一步改进,例如我遗漏的一个参数,这会加快这个数据量的速度?
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)
本地返回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)
给出415 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
,这对我的应用来说更容易接受。 (加载到一个numpy阵列可以在~70.4μs内完成,无需加载到数据帧中,所以我可能最终使用它)
但是,是否有可能进一步加快pd.read_csv
示例,如果没有 - 任何人都可以帮助我理解大三角洲背后的原因吗?
通常我们看到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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.