【问题标题】:Performance of Python Pandas vs. C++ solution for textual CSV data import用于文本 CSV 数据导入的 Python Pandas 与 C++ 解决方案的性能对比
【发布时间】:2013-11-19 10:10:33
【问题描述】:

我们目前有一个用 C++ 编写的数据导入/转换工具,它主要处理文本(例如几种不同格式的时间戳)数据并应用一些规范化/清理。

当前的解决方案速度非常快,性能至关重要。例如。我们进行了优化以最小化/避免解析循环中的对象分配,因为我们处理的每一行都会调用它,并且可能会产生严重的性能影响。

我们想要实现的是灵活地添加新的输入格式或应用额外的转换,只需更改脚本/配置文件而不是重新编译应用程序。

问题是:我们是否能够使用 Python Pandas 数据处理框架实现相当的性能,因为其中大部分似乎也使用低级优化 C 代码。

(这里的“可比”表示性能差异在可以通过添加2-4个额外线程来补偿的余量内)

Pandas 是适合这项工作的工具还是有不同的建议?

【问题讨论】:

  • Pandas 确实很快。我怀疑它是否比纯 C++ 更快,但我确信您知道唯一确定的方法是分析每个解决方案。我所知道的加快 Pandas 时间序列 CSV 解析的最佳技巧是:使用自定义日期解析函数,该函数利用字符串切片而不是 strptime。
  • 有一些工具可以从 python 创建c 代码,但即使你这样做,我认为它不会比你的版本更快,因为 python 作为动态语言有开销。当 c++ 实现尚不可用时,您可能可以通过向 python 实现添加回退来实现灵活性。
  • @Exceptyon 你应该学会仔细阅读。 Python 在数字运算方面要慢 10 到 100 倍。进行 I/O 时,几乎所有时间都将被系统调用占用,而系统调用在 any 语言中花费相同的时间,因此在这种情况下,python 和 C/C++ 之间的区别是 much 更小,在某些情况下甚至不存在。 OP 正在询问开销在其特定应用程序中是否会很重要。我敢打赌,它可能很重要,但我敢打赌,它会比 10 倍的减速更小,可能要小得多。
  • 无论如何,在没有告诉我们您到底想要做什么以及您有哪些限制的情况下,除了提供一些一般性建议外,我看不出我们如何回答您的问题。 pandas 似乎是这项工作的最佳人选,但我不能排除对于您的特定应用程序可能会有更好的东西。
  • @Exceptyon 您的评论没有帮助或消息灵通。 pandas CSV 文件读取代码大部分是用 C 编写的,因此与仅用 C++ 编写的文件读取器具有相似的性能特征。

标签: c++ python performance csv pandas


【解决方案1】:

不要让您感到困惑,但如果您真的想要速度,那么 HDF5 就是要走的路,甚至不解析 csv(所以一点预处理可以走很长的路)。 a related comparision of hdf and sql

In [9]: df = DataFrame(randn(1000000,2),columns=list('AB'))

In [10]: df['date'] = Timestamp('20130101')

In [11]: df.to_csv('test.csv',mode='w')

In [12]: df.to_hdf('test.h5','df',mode='w')

In [13]: %timeit read_csv('test.csv',index_col=0)
1 loops, best of 3: 948 ms per loop

In [14]: %timeit pd.read_hdf('test.h5','df')
10 loops, best of 3: 20.2 ms per loop

【讨论】:

  • 我认为 OP 正在描述 HDF5 无法帮助您完成的 ETL 作业,我不认为。
  • 同意。目前尚不清楚中间存储是否是一种选择。
  • 是的,感谢 HDF5 的提示,但这是针对解析来自我无法控制的不同来源的输入文件,因此我们需要 CSV 解析器,我们正在寻找自定义解析的灵活性使用 Python 的不同字段。
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2023-03-30
  • 2023-02-08
  • 1970-01-01
  • 2016-11-24
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多