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)
  • 使用矩阵A(
    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

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

  • 在遇到性能问题之前,您不应该关心性能问题。在99.99%的情况下,任何方法都适用于您。代码首先应该是可读的,然后才是可执行的

  • 在您的具体示例中,带有函数的代码应该较慢(仅仅因为额外的函数调用),或者可能具有相同的性能(如果编译器将其内联)。顺便说一句-请看#1-您不应该首先关心和编写可读代码

  • 如果您真的需要性能代码,那么有很多库(例如NumPy)。图书馆通常工作得更快。有些方法甚至可能


  • 另请参见

    找出问题的最佳方法是对两者进行计时并监控内存使用情况。我怀疑函数(搜索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)