cap*_*tle 1 python serialization numpy pickle pandas
我需要序列化DataFrames并通过网络发送它们.出于安全考虑,我不能使用泡菜.
下一个最快的方法是什么?我在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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的最好的方法是使用array.tostring()序列化同源numpy数组(df.as_blocks()很方便)并从中重建DataFrame.性能与泡菜相当.
但是,使用这种方法,我被迫将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))
Run Code Online (Sandbox Code Playgroud)
上面的例子
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
Run Code Online (Sandbox Code Playgroud)
更大的框架
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
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用内存中的hdf文件
见这里:http://pytables.github.io/cookbook/inmemory_hdf5_files.html ; 在pandas中还没有支持添加驱动程序arg(可以通过简单的猴子修补来完成).
另一种可能性a ctable,请参阅https://github.com/FrancescAlted/carray.但是在pandas ATM中不支持.
| 归档时间: |
|
| 查看次数: |
3960 次 |
| 最近记录: |