【问题标题】:What's the fastest way to pickle a pandas DataFrame?腌制熊猫数据框的最快方法是什么?
【发布时间】:2015-02-26 23:15:31
【问题描述】:

使用 Pandas 内置方法和pickle.dump哪个更好?

标准的泡菜方法如下所示:

pickle.dump(my_dataframe, open('test_pickle.p', 'wb'))

Pandas 内置方法如下所示:

my_dataframe.to_pickle('test_pickle.p')

【问题讨论】:

  • 为什么不只是对它们进行基准测试?
  • @tolanj 你所说的基准究竟是什么意思?我在下面的答案中包含了时间。
  • 对于那些需要panda.DataFrame 序列化的良好基准的人:FastSerialization
  • 第一种方法更通用:假设您有自己的自定义文件系统和用于在其中打开文件的库。在这种情况下,my_dataframe.to_pickle('my/weird/path') 将无法正常工作,而 pickle.dump(my_dataframe, my_weird_fs.open('/my/weird/path', 'wb')) 将正常工作。

标签: python pandas pickle


【解决方案1】:

感谢@qwwqwwq,我发现pandas 有一个内置的to_pickle 数据帧方法。我做了一个快速的时间测试:

In [1]: %timeit pickle.dump(df, open('test_pickle.p', 'wb'))
10 loops, best of 3: 91.8 ms per loop

In [2]: %timeit df.to_pickle('testpickle.p')
10 loops, best of 3: 88 ms per loop

所以看起来内置只是稍微好一点(对我来说,这很有用,因为这意味着它可能不值得重构代码来使用内置) - 希望这对某人有所帮助!

【讨论】:

  • 您为什么关心处理时间?我认为功能更重要。 to_pickle 有什么额外的功能吗?只是不用导入pickle的方便吗?
  • 这已经很晚了,但只是为了插话:似乎对于非常大的数据帧,无论方法如何,写入时间(pickle.dumpdf.to_pickle)都大致相同,但读取时间对于使用df.to_pickle 创建的文件,速度快得多。在大小为 53330 行 x 21 列的数据帧上使用timeit,解开用pickle.dump 编写的文件需要115 毫秒,而解开用df.to_pickle 编写的文件只需3 毫秒。不知道巨大的加速来自哪里,但它很明显。
  • 感谢塔莎的加入,非常有帮助。真的很好奇为什么存在速度差异,我原以为它们都应该产生同一个文件。
【解决方案2】:

简单的基准测试,对吧?

完全没有区别,实际上我希望 Pandas 实现 getstate 以便调用 pickle.dump(df) 实际上与调用 df.to_pickle() 相同。

如果你在 Pandas 源代码中搜索 __getstate__,你会找到 that it is implemented on several objects

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 2022-01-11
    • 2021-05-23
    • 2023-02-08
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2020-08-01
    相关资源
    最近更新 更多