python - 与 Matlab 相比,Numpy 加载 csv 太慢了

标签 python matlab csv numpy

我发布这个问题是因为我想知道我是否做错了什么才能得到这个结果。

我有一个中等大小的 csv 文件,我尝试使用 numpy 来加载它。为了说明,我使用python制作了文件:

import timeit
import numpy as np

my_data = np.random.rand(1500000, 3)*10
np.savetxt('./test.csv', my_data, delimiter=',', fmt='%.2f')

然后,我尝试了两种方法:numpy.genfromtxt,numpy.loadtxt

setup_stmt = 'import numpy as np'
stmt1 = """\
my_data = np.genfromtxt('./test.csv', delimiter=',')
"""
stmt2 = """\
my_data = np.loadtxt('./test.csv', delimiter=',')
"""

t1 = timeit.timeit(stmt=stmt1, setup=setup_stmt, number=3)
t2 = timeit.timeit(stmt=stmt2, setup=setup_stmt, number=3)

结果显示t1 = 32.159652940464184, t2 = 52.00093725634724
但是,当我尝试使用 matlab 时:

tic
for i = 1:3
    my_data = dlmread('./test.csv');
end
toc

结果显示:耗时是3.196465秒

我了解加载速度可能存在一些差异,但是:

  1. 这远远超出了我的预期;
  2. 不是说 np.loadtxt 应该比 np.genfromtxt 快吗?
  3. 我还没有尝试过 python csv 模块,因为加载 csv 文件是我经常做的事情,而且使用 csv 模块,编码有点冗长......但如果是这样的话,我很乐意尝试唯一的办法。目前我更担心是不是我做错了什么。

任何意见将不胜感激。提前非常感谢!

最佳答案

是的,将 csv 文件读入 numpy 非常慢。代码路径上有很多纯 Python。这些天来,即使我使用纯 numpy 我仍然使用 pandas 进行 IO:

>>> import numpy as np, pandas as pd
>>> %time d = np.genfromtxt("./test.csv", delimiter=",")
CPU times: user 14.5 s, sys: 396 ms, total: 14.9 s
Wall time: 14.9 s
>>> %time d = np.loadtxt("./test.csv", delimiter=",")
CPU times: user 25.7 s, sys: 28 ms, total: 25.8 s
Wall time: 25.8 s
>>> %time d = pd.read_csv("./test.csv", delimiter=",").values
CPU times: user 740 ms, sys: 36 ms, total: 776 ms
Wall time: 780 ms

或者,在这样一个足够简单的情况下,您可以使用 Joe Kington 所写的 here :

>>> %time data = iter_loadtxt("test.csv")
CPU times: user 2.84 s, sys: 24 ms, total: 2.86 s
Wall time: 2.86 s

还有 Warren Weckesser 的 textreader库,以防 pandas 依赖太重:

>>> import textreader
>>> %time d = textreader.readrows("test.csv", float, ",")
readrows: numrows = 1500000
CPU times: user 1.3 s, sys: 40 ms, total: 1.34 s
Wall time: 1.34 s

关于python - 与 Matlab 相比,Numpy 加载 csv 太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259393/

相关文章:

python - 在 2 个不同的列中做滚动平均并在 Python 中创建一个列

c++ - std::random_device 和 std::mt19937 服从均匀分布吗?

arrays - 循环移动向量

java:扫描仪在使用useDelimiter时要求额外的值

python - 使用Scrapy,无法抓取超过我的起始网址的链接

python - 我只需要附加那些在 pyspark 数据框中具有非空值的人

CT扫描的Matlab分割

node.js - 在node js中获取mongodb集合数据到csv

csv - 如何从 compojure API 流式传输大型 CSV 响应,以便整个响应不会立即保存在内存中?