gpt4 book ai didi

python - 除了 to_pickle 之外,序列化 DataFrame 最快的方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:28 29 4
gpt4 key购买 nike

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

下一个最快的方法是什么?我对 v0.13 中的 msgpacks 很感兴趣,但除非我做错了什么,否则性能似乎比 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

到目前为止我发现的最好的方法就是使用 array.tostring() 序列化同质 numpy 数组(df.as_blocks() 很方便)并从中重建 DataFrame。性能与 pickle 相当。

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

最佳答案

现在这个 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))

上面的例子

In [6]: %timeit buf = pack(df)
1000 loops, best of 3: 492 µs per loop

In [7]: %timeit buf = pkl.dumps(df,pkl.HIGHEST_PROTOCOL)
1000 loops, best of 3: 681 µs per loop

更大的框架

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 .不过 pandas ATM 尚不支持。

关于python - 除了 to_pickle 之外,序列化 DataFrame 最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914508/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com