当前位置: 首页 > 面试题库 >

numpy的csv TOO与Matlab相比太慢

潘自强
2023-03-14
问题内容

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

我有一个中等大小的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我仍然会使用pandasIO:

>>> 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在此处写的内容:

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


 类似资料:
  • 问题内容: 我想使用NumPy执行以下MATLAB代码的等效项:。我将如何完成? 问题答案: 对于Matlab用户,这是一个更好(官方)的NumPy链接-恐怕其中的Mathesaurus已经过时了。 的numpy的当量是。 这适用于多个维度,并提供与matlab类似的结果。(Numpy给出了3d输出数组,正如您期望的那样-由于某些原因,matlab提供了2d输出-但内容相同)。 Matlab: 蟒

  • 是否有一种惯用的方法来比较两个NumPy数组,它们将NaN视为彼此相等(但不等于NaN以外的任何东西)。 例如,我希望以下两个数组比较相等: 和以下两个数组进行比较: 我正在寻找一种可以产生标量布尔结果的方法。 以下方法可以做到这一点: 但它很笨重,并且创建了所有这些中间数组。 有没有一种方法可以更容易地观察眼睛,更好地利用记忆? 另外,如果有帮助的话,已知数组具有相同的形状和数据类型。

  • 我有一个AVI视频,我需要处理在C++使用OpenCV。问题是OpenCV检测到的FrameRate为30,而在Matlab中,视频阅读器对相同的视频文件检测到的FrameRate为60。因此,与Matlab相比,C++只能提取一半的帧。 我尝试在C++中使用CV::VideoCapture::Set(CV::CAP_PROP_FPS)将FPS设置为60,但这并不影响它。我读到它也与视频捕获后端有

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 问题内容: 与常规Python列表相比,NumPy有什么优势? 我有大约100个金融市场系列,我将创建一个100x100x100 = 1百万个单元的多维数据集数组。我将每个x与y和z回归(3变量),以用标准误差填充数组。 我听说对于“大型矩阵”,出于性能和可伸缩性的原因,我应该使用NumPy而不是Python列表。事实是,我知道Python列表,它们似乎对我有用。 如果我转到NumPy,会有什么好

  • 问题内容: 在Numpy中,我可以生成一个布尔数组,如下所示: 是否可以将比较链接在一起?例如: 问题答案: 据我所知,你可以得到的最接近的是使用,以及: 我认为您将无法获得样式链接。