python - python 列表是行优先排序还是列优先排序?

标签 python performance list

我在维基百科上读到 python 是一种实现行优先顺序的语言。但我正在尝试乘以 2 个矩阵,我使用行优先方法和列优先方法访问这些矩阵。但是当我执行代码时,列优先方法总是更快。 我将在此处发布我的代码片段:

class Matrix:

#flag indicates the type of matrix
def __init__(self, num_lines, num_cols, flag):
    self.num_lines = num_lines
    self.num_cols = num_cols
    if flag == 0:
        # First Matrix
        self.matrix = [1]*num_lines*num_cols
    elif flag == 1:
        # Second Matrix
        self.matrix = [0]*num_lines*num_cols
        for i in range(num_lines):
            for j in range(num_cols):
                self.matrix[i*num_cols+j] = i+1
    elif flag == 2:
        # Result Matrix
        self.matrix = self.matrix = [0]*num_lines*num_cols

def setMatrixValue(self, line, column, value):
    self.matrix[line*self.num_cols + column] = value

def getMatrixValue(self, line, column):
    return self.matrix[line*self.num_cols + column]






def multiplyMatrices(num_lines, num_cols, flag):
    matrix_a = Matrix(num_lines, num_cols, 0)
    matrix_b = Matrix(num_cols, num_lines, 1) 
    matrix_result = Matrix(num_lines, num_lines, 2)

    # Column-major approach
    if flag == 0:
        start_time = time.time()
        for i in range(matrix_result.num_lines):
            for j in range(matrix_result.num_cols):
                temp = 0
                for k in range(matrix_a.num_cols):
                    temp += matrix_a.getMatrixValue(i, k) * matrix_b.getMatrixValue(k, j)
                matrix_result.setMatrixValue(i,j,temp)
    # Row-major approach
    elif flag == 1:
         start_time = time.time()
         for i in range(matrix_result.num_lines):
            for k in range(matrix_result.num_cols):
                for j in range(matrix_a.num_lines):
                    matrix_result.setMatrixValue(i,j, matrix_result.getMatrixValue(i,j) + (matrix_a.getMatrixValue(i,k) * matrix_b.getMatrixValue(k,i)))                 

    end_time = time.time()
    print matrix_result.matrix
    diffTime(start_time, end_time)

我刚刚意识到 python 中的矩阵乘法比 Java 或 C++ 慢得多。有什么理由吗?

最佳答案

您期望的行为是由访问顺序内存地址的优势引起的。所以在这里

self.matrix[line*self.num_cols + column]

您可能希望在内循环中递增列。

这个概念在纯 Python 中存在一些问题。由于所有 int 都是对象 - 要访问它们,您首先要从列表中顺序获取引用(好),但随后您需要访问引用的内存(非顺序)以获取 int 对象(坏)。

幸运的是还有其他选择,例如 numpy。此外,您还可以使用经过良好测试的矩阵例程。

关于python - python 列表是行优先排序还是列优先排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111662/

相关文章:

javascript - 如何在单页(Web)应用程序上进行 "end-client"性能测试?

c - 遍历C指针列表: weird printf behaviour

c++ - 使用指针而非迭代器删除 std::list 中的元素

Python rpy2 错误加载 edgeR R 包,但它已安装并在 R 中工作

python - 使用 NRF24L01 将 Arduino 浮点值转换为 Python

python - 无法调用类 bark()

sql - 从包含数千条的 MySQL View 中查询单个记录是否相当于查询那几千条 + 1?

objective-c - 除法比乘法慢吗?

python - 如何迭代多个不同长度的列表,但重复较短列表的最后一个值,直到完成最长列表?

python - 从 groupby pandas 中获取 MultiIndex