Numpy的Genfromtxt比pandas的read_csv慢

7

我正在加载一个CSV文件(如果您需要特定的文件,它是来自http://www.kaggle.com/c/loan-default-prediction的训练csv)。使用numpy加载CSV比pandas慢得多。

timeit("genfromtxt('train_v2.csv', delimiter=',')", "from numpy import genfromtxt",  number=1)
102.46608114242554

timeit("pandas.io.parsers.read_csv('train_v2.csv')", "import pandas",  number=1)
13.833590984344482

我还要提一下,numpy的内存使用量波动更大,更高,并且在加载后具有显着更高的内存使用量(2.49 GB对比pandas的约600MB)。 pandas中的所有数据类型都是8字节,因此不同的dtype并不是区别所在。我远未达到最大内存使用量,因此时间差异不能归因于分页。
这种差异有任何原因吗? genfromtxt效率低下吗? (并且泄漏了大量内存?)
编辑:
numpy版本1.8.0 pandas版本0.13.0-111-ge29c8e8

6
基本上是的。genfromtxt 效率较低,并非存在内存泄漏问题,只是它实质上是将所有数据读入 Python 列表,然后再转换为 NumPy 数组。相比之下,pandas.read_csv 更加高效。不想自夸,但可以在这里参考一下:https://dev59.com/nGox5IYBdhLWcg3wzXel#8964779,该网址比较了几种加载文本文件的 NumPy 方法(该回答有意地没有涉及pandas.read_csv, 但它的性能与最后一个示例类似)。 - Joe Kington
2
如果真是这样的话,也许我会考虑提交一个 numpy 的补丁。目前情况是,先加载 DataFrame,然后跟着使用 df.as_matrix() 总共需要约 15 秒,而 genfromtxt 则需要 102 秒。 - Kurt Spindler
谢谢您提供指向您其他问题的指针,这很有启发性。 - Kurt Spindler
5
这是Wes写的关于“read_csv”的原始文章链接:http://wesmckinney.com/blog/?p=543 - Jeff
1
@JoeKington 或许你可以将你的评论发表为一个回答... - Saullo G. P. Castro
这是Wes建议的更新帖子链接,由@Jeff提供:https://wesmckinney.com/blog/a-new-high-performance-memory-efficient-file-parser-engine-for-pandas/ - Ken T
1个回答

0
Numpy模块中的'genfromtxt'运行两个主要循环。第一个将文件中所有行转换为字符串,第二个循环将每个字符串转换为它们的数据类型。但是,与loadtxt和read_csv等其他命令相比,'genfromtxt'能提供更多的灵活性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接