【问题标题】:Quickest ways to read large files with varying number columns in Python在 Python 中读取具有不同列数的大文件的最快方法
【发布时间】:2017-09-20 19:17:33
【问题描述】:

我在文件data.txt 中有一个浮点数数据集,其中每行包含可变数量的列。例如:

    3.0 2.5
    1.1 30.2 11.5
    5.0 6.2
    12.2 70.2 14.7 3.2 1.1

为了阅读它,我可以在 Matlab 中轻松地使用 fopenfscanf 的组合。最后一个是按列顺序读取数据并转换成数组,像这样:

    array = [3.0 2.5 1.1 30.2 11.5 5.0 6.2 12.2 70.2 14.7 3.2 1.1]'

我想将我的 Matlab 代码翻译成 Python。但由于没有替代 Matlab 的fscanf 的 Python 内置函数,我编写了以下 Python 代码,以与描述相同的方式读取和重塑数据:

    from numpy import *

    data = []
    with open('data.txt') as file:
       for line in file:
          cline = line.split()
          data = data + cline

    data = array(data)

这可行,但我的一些数据集最多可以有 200,000 行,而且我展示的 Python 代码对于读取大型数据集(大约 10 分钟)非常慢。另一方面,Matlab 的fscanf 只需几秒钟或更短的时间就能完成这项工作。那么,有没有比我的代码在 Python 中执行此操作更快(优化)的方法?

如果有任何建议,我将不胜感激。

【问题讨论】:

  • 你也有熊猫吗?
  • 不,我没有熊猫。我目前不知道如何在这种情况下使用它。但我在其中一个答案中找到了解决方案:将data = data + cline替换为data.extend(cline),代码运行不到一秒。

标签: python file pandas numpy


【解决方案1】:

在几千行之后,这需要做大量的额外工作:

    data = data + cline

只需data.extend(cline)。 (或者.append(),如果你想知道哪些数字一起出现在一行中。)

考虑存储双精度而不是文本:

    data.extend([float(c) for c in line.split()])

【讨论】:

  • 好点。实际上data += cline 会完成这项工作。
  • 非常感谢!应用此修复后,代码将在不到一秒的时间内运行。
【解决方案2】:

numpy.loadtxt 在此处本来是完美的,但在此处不适用,因为列数会发生变化。

您想要一个平面列表,您可以通过使用列表推导来加快速度:

from numpy import *
with open("file.txt") as f:
    data = array([float(x) for l in f for x in l.split()])

(现在我很确定,考虑到 JH 在他的回答中指出的错误:data = data + line 每次都会创建一个新列表:二次复杂度。通过列表理解可以避免这种情况)

【讨论】:

    【解决方案3】:

    Pandas 在处理参差不齐的列方面比 numpy 更好/更快,并且应该比带有循环的 vanilla python 实现更快。

    使用read_csv,后跟stack,然后访问values属性返回一个numpy数组。

    max_per_row = 10 # set this to the max possible number of elements in a row
    
    vals = pd.read_csv(buf, header=None, names=range(max_per_row),
                                 delim_whitespace=True).stack().values
    
    print(vals)
    array([  3. ,   2.5,   1.1,  30.2,  11.5,   5. ,   6.2,  12.2,  70.2,
            14.7,   3.2,   1.1])
    

    【讨论】:

    • 我刚刚安装了 pandas 并测试了这段代码。是的!它的工作速度与其他 python 实现一样快。从现在开始,我会牢记这两种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多