由于找不到关于此主题的任何内容,因此我决定在这里提出此问题。我完全是新手,这个问题可能很荒谬。
假设我们有A(NxN)
矩阵和列向量(B(Nx1)
)。我们还有一个函数f(i,j)
,该函数返回行A
和列i
处的矩阵j
的元素。
如果我们要进行一些矩阵运算,例如A
和B
的矩阵乘积,则可以使用:以下内容(下面的C
是矩阵积的结果) :
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
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或任何其他特定语言。
答案 0 :(得分:2)
老实说,这没有正确答案,因为这取决于您愿意牺牲的内容以及所使用的语言。 无论如何,主要区别是函数方法将比矩阵方法花费更多的时间,而矩阵方法将花费更多的空间(显然吗?)。
使用时间来节省内存通常不是一个好主意,因为我们拥有足够的内存并且时间更少。
我在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
如您所见,矩阵方法越大,收到的时间越长
答案 1 :(得分:1)
在遇到性能问题之前,您不应该关心性能问题。在99.99%的情况下-任何方法都对您有效。首先,代码应该是可读的,然后是性能About premature optimization
在您的具体示例中-具有函数的代码应该更慢(仅是由于附加的函数调用)或可能具有相同的性能(如果编译器将其内联)。顺便说一句-参见#1-首先您应该不在乎并编写可读代码
如果您确实需要高性能的代码-可以使用大量的库(例如NumPy)。图书馆通常会更快地工作。有些方法甚至可以delegate calculation to the GPU