【问题标题】:Matrix vs function for matrix operations矩阵运算的矩阵与函数
【发布时间】:2019-06-26 13:47:52
【问题描述】:

由于我找不到有关此主题的任何信息,因此我决定在这里提出这个问题。我完全是初学者,这个问题可能很荒谬。

假设我们有A(NxN) 矩阵和一个列向量 (B(Nx1))。我们还有一个函数f(i,j),它返回矩阵A 在行i 和列j 的元素。

如果我们想做一些矩阵运算,比如A 和B 的矩阵乘积,我们可以使用:以下(下面,C 是矩阵乘积的结果):

  1. 使用函数f(i,j):
N = 100000


def f(i, j):
    return i + j


for i in range(N):
    for j in range(N):
        s = 0
        for k in range(N):
            s += f(i, k) * B[k]
        C[i] = s
  1. 使用矩阵 A (NxN)(假设 A 已经定义并且包含函数 f 返回的相同元素)
N = 100000
for i in range(N):
     for j in range(N):
        s = 0
        for k in range(N):
            s += A[i,k]*B[k]
        C[i] = s

在我看来,该函数的优点是它避免了存储矩阵的所有值,从而节省了内存。

我的问题是:

  • 在这种情况下,最有效的矩阵乘法方法是(使用函数还是矩阵本身)?

  • 这两种方法在性能上有区别吗?

编辑:我的问题并非特定于 Python 或任何其他特定语言。

【问题讨论】:

  • 找出它们的最佳方法是对它们进行计时并监控内存使用情况。我怀疑函数(搜索生成器 python)方法会更快,因为您不必存储或设置矩阵

标签: performance function matrix


【解决方案1】:

老实说,这没有正确的答案,因为它取决于您愿意牺牲什么以及所使用的语言。 无论如何,主要区别在于函数方法会比矩阵方法花费更多时间,而矩阵方法会占用更多空间(显然?)。

使用时间来节省内存通常不是一个好主意,因为我们有丰富的内存而时间却少得多。

我在 python 中运行了这些 N=10 得到Function 0.015623331069946289, Matrix 0.0

N=100 得到Function 1.0839078426361084, Matrix 0.8769278526306152

~当前运行N=1000~

任何更大的东西,我都必须切换到 Numpy。

这是我用来计时的代码,如果有人想试试的话。

import time
n = 1000
def f(i, j):
  return i+j

A = [[i+j  for j in range(n)] for i in range(n)]
B = [i for i in range(n)]
C = [0 for _ in range(n)]

start1 = time.time()
for i in range(n):
  for j in range(n):
    s = 0
    for k in range(n):
      s += f(i, k) * B[k]
    C[i] = s
end1 = time.time()

start2 = time.time()
for i in range(n):
  for j in range(n):
    s = 0
    for k in range(n):
      s += A[i][k]*B[k]
    C[i] = s
end2 = time.time()


print("Function-", end1-start1, ", Matrix-", end2-start2)

当然,如您的问题所述,这种方法假设矩阵已经设置,因为这也需要大量时间。

编辑:运行 N=1000,得到 Function 620.2477366924286, Matrix 478.4342918395996

如您所见,使用矩阵方法获得的时间越大,效果越好

【讨论】:

  • 为什么要使用 Python 进行比较???其他语言呢?例如对于 C++,有一些内联函数在这种情况下可能非常有用。抱歉,这不是我想要的答案。这里还引用了赏金描述:“我正在寻找矩阵和函数之间的性能比较。我希望看到不同编程语言的答案,而不仅仅是 Python”
  • @Freshman42 抱歉,这需要一段时间才能回复。我要说的是它根本不是特定于语言的。我只是使用 python,因为它很容易进行原型设计。无论使用哪种语言,您都处于一个必须使用更多内存或更多时间的地方。由于内存是丰富的(通常),使用更多的内存比浪费时间试图节省内存更好。矩阵方法在性能方面总是更快。
【解决方案2】:
  1. 在遇到性能问题之前,您不应该关心性能问题。在 99.99% 的情况下 - 任何方法都适合您。代码首先应该是可读的,然后是高性能的About premature optimization

  2. 在您的具体示例中 - 带有函数的代码应该更慢(只是因为额外的函数调用)或者可能具有相同的性能(如果编译器将内联它)。顺便说一句 - 见 #1 - 你不应该关心并首先编写可读代码

  3. 如果您真的需要高性能代码 - 有很多库可以满足您的需求(例如 NumPy)。库通常会运行得更快。有些方法甚至可以delegate calculation to the GPU

另见matrix multiplication performance

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2016-03-31
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多