除了“泡菜”之外,序列化数据帧的最快方法是什么?

2024-03-28 14:13:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要序列化数据帧并通过网络发送它们。出于安全原因,我不能使用pickle。在

下一个最快的方法是什么?我对v0.13中的msgpack很感兴趣,但除非我做错了什么,否则性能似乎比pickle差得多。在

In [107]: from pandas.io.packers import pack

In [108]: df = pd.DataFrame(np.random.rand(1000, 100))

In [109]: %timeit buf = pack(df)
100 loops, best of 3: 15.5 ms per loop

In [110]: import pickle

In [111]: %timeit buf = pickle.dumps(df)
1000 loops, best of 3: 241 µs per loop

到目前为止,我发现的最好的方法就是序列化同质numpy数组(数据框()很方便)使用数组.tostring()并从中重建数据帧。性能堪比泡菜。在

但是,由于Numpy的fromstring()无法反序列化dtype=object,因此我被迫将dtype=object的列(即至少有一个字符串的任何列)转换为完全字符串。Pickle设法在对象列中保留混合类型(它似乎在Pickle输出中包含了一些函数)。在


Tags: of数据方法inimportdf序列化性能
1条回答
网友
1楼 · 发布于 2024-03-28 14:13:31

它现在与PR:https://github.com/pydata/pandas/pull/5498(很快将合并为0.13)非常有竞争力

In [1]: from pandas.io.packers import pack

In [2]: import cPickle as pkl

In [3]: df = pd.DataFrame(np.random.rand(1000, 100))

以上示例

^{pr2}$

更大的框架

In [8]: df = pd.DataFrame(np.random.rand(100000, 100))

In [9]:  %timeit buf = pack(df)
10 loops, best of 3: 192 ms per loop

In [10]: %timeit buf = pkl.dumps(df,pkl.HIGHEST_PROTOCOL)
10 loops, best of 3: 119 ms per loop

另一个选择是使用内存中的hdf文件

请看这里:http://pytables.github.io/cookbook/inmemory_hdf5_files.html;在pandas中还没有支持添加驱动程序arg(但是可以通过简单的猴子补丁来完成)。在

另一种可能性是ctable,见https://github.com/FrancescAlted/carray。但熊猫自动取款机还不支持。在

相关问题 更多 >