python - 使用 numpy 快速更新矩阵

标签 python arrays numpy file-io matrix

我的问题是,我需要从格式为

的文件中读取大约 5000 万行
x1 "\t" x2 "\t" .. x10 "\t" count

然后用 A[j][i] = Sum (over all lines) count * x_i * x_j 计算矩阵 A。

我尝试了两种方法,每行都读取文件行:

1) 将 A 保留为 Python 矩阵并在 for 循环中更新:

  for j in range(size):
    for i in range(size):
      A[j][i] += x[j] * x[i] * count

2) 使 A 成为一个 numpy 数组,并使用 numpy.add 更新:

  numpy.add(A, count * numpy.outer(x, x))

令我惊讶的是,第二种方法比第一种方法慢了大约 30%。而且两者都非常慢 - 整个文件大约需要 10 分钟......

有什么方法可以加快矩阵的计算速度吗?也许有一些函数可以完全从文件(或大块)读取数据而不是逐行读取数据?有什么建议吗?

最佳答案

一些想法:

  • 使用pandas.read_csv使用 C 引擎读取文件。它比 np.genfromtxt 快很多,因为引擎是 c/Cython 优化的。
  • 您可以读取内存中的整个文件,然后进行计算。这是最简单的方法,但从效率的角度来看,您的 CPU 将大部分空闲以等待输入。这段时间可以更好地用于计算。
  • 您可以尝试逐行阅读和处理(例如:使用 cvs 模块)。虽然 io 到最后仍然是瓶颈,但您将处理完您的文件。这里的问题是,由于 Python 开销,您仍然会有一些效率损失。
  • 最好的组合可能是使用 pandas.read_csviteratorchunk_size 参数集按 block 读取,并在一定时间内处理 block 时间。我敢打赌,有一个最佳的 block 大小将击败其他方法。

关于python - 使用 numpy 快速更新矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28111437/

相关文章:

java - Java 中自定义对象数组的自定义方法

c++ - 如何将 QString 或 QStringList 传递给 QTableWidgetItem

python - Django,在查询中使用 ANY

python - 可用 **kwargs 列表

python - 单选按钮 tkinter 传递主机值

python - 在python中的指定行/列处合并二维数组(不同维度)

python - numpy 对象数组

c - 如何使 Python 对象表现得像 numpy 数组?

python - 为什么Python共享内存需要副本?

python - 本示例中使用什么正则表达式