Performance 矩阵运算的矩阵与函数
因为我找不到关于这个主题的任何东西,所以我决定在这里问这个问题。我完全是初学者,这个问题可能很可笑 假设我们有Performance 矩阵运算的矩阵与函数,performance,function,matrix,Performance,Function,Matrix,因为我找不到关于这个主题的任何东西,所以我决定在这里问这个问题。我完全是初学者,这个问题可能很可笑 假设我们有A(NxN)矩阵和列向量(B(Nx1))。我们还有一个函数f(i,j),它返回矩阵a行i和列j的元素 如果我们想做一些矩阵运算,比如说,A和B的矩阵积,我们可以使用:以下(下面,C是矩阵积的结果): 使用函数f(i,j): 使用矩阵A(NxN)(假设A已经定义,并且包含函数f返回的相同元素) 在我看来,该函数的优点在于它避免了存储矩阵的所有值,从而节省了内存 我的问题是: 在这种情况下
A(NxN)
矩阵和列向量(B(Nx1)
)。我们还有一个函数f(i,j)
,它返回矩阵a
行i
和列j
的元素
如果我们想做一些矩阵运算,比如说,A
和B
的矩阵积,我们可以使用:以下(下面,C
是矩阵积的结果):
f(i,j)
:NxN
)(假设A已经定义,并且包含函数f
返回的相同元素)- 在这种情况下,进行矩阵乘法(使用函数或矩阵本身)的最有效方法是什么
- 这两种方法之间是否存在性能差异
编辑:我的问题不是针对Python或任何其他特定语言的 老实说,这没有正确的答案,因为这取决于你愿意牺牲什么,也取决于你所使用的语言。 不管怎样,主要区别在于函数法比矩阵法需要更多的时间,而矩阵法需要更多的空间(显然?) 使用时间来节省内存通常不是一个好主意,因为我们有丰富的内存和少得多的时间 我用python和 N=10,得到
函数0.015623331069946289,矩阵0.0
N=100,得到函数1.0839078426361084,矩阵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,得到函数620.247736924286,矩阵478.4342918395996
如您所见,使用矩阵方法得到的时间越大越好
另请参见找出问题的最佳方法是对两者进行计时并监控内存使用情况。我怀疑函数(搜索python生成器)方法会更快,因为您不必存储或设置矩阵为什么要使用python进行比较???其他语言呢?例如,C++中有一些内联函数,在这种上下文中可能非常有用。对不起,这不是我想要的答案。这里还引用了赏金描述中的一句话:“我正在寻找矩阵和函数之间的性能比较。我希望看到不同编程语言的答案,不仅仅是Python”@Freshman42抱歉,这需要一段时间才能做出响应。我想说的是,它根本不是特定于语言的。我之所以使用python,是因为它很容易实现原型。不管使用哪种语言,你所处的位置要么需要更多的内存,要么需要更多的时间。由于内存是丰富的(通常),与其浪费时间试图节省内存,不如使用更多内存。矩阵方法在性能方面总是更快。
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
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)