我发布了这个问题,因为我想知道我是否做错了什么严重的事情才能获得此结果。

我有一个中等大小的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秒

我了解加载速度可能会有一些差异,但是:
  • 这比我预期的要多得多;
  • 是不是np.loadtxt应该比np.genfromtxt快?
  • 我还没有尝试过python csv模块,因为加载csv文件是我经常要做的事情,而使用csv模块,编码有点冗长...但是我很乐于尝试,如果那是唯一的话道路。目前,我更担心自己是否做错了什么。

  • 任何输入将不胜感激。在此先多谢!

    最佳答案

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

    >>> 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
    

    如果pandas过于依赖,还有Warren Weckesser的textreader库:
    >>> 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 - numpy的csv TOO与Matlab相比慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18259393/

    10-11 12:59
    查看更多