我在维基百科上读到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 ++慢得多。有什么理由吗?
答案 0 :(得分:3)
您期望的行为是由访问顺序内存地址的优势引起的。所以这里
self.matrix[line*self.num_cols + column]
您可能希望在内循环中增加列。
在纯Python中,这个概念存在一些问题。由于所有的int都是对象 - 要访问它们,你首先从列表中顺序获取引用(好),但是你需要访问引用的内存(非顺序)来获取int对象(坏)。 / p>
幸运的是还有其他选择,例如numpy。另外还有你可以使用的经过良好测试的矩阵例程。
答案 1 :(得分:2)
Python很慢,因为它会在运行时检查所有对象的类型,以决定要执行的操作(例如,当它看到'*'时,它应该使用哪个 mult )。不仅如此,大多数简单数据类型的抽象都会在您将数据输入和输出对象时产生运行时成本。
您可以使用numpy缓解部分速度问题。 e.g。
import numpy
numpy.matrix([0, 1]) * numpy.matrix([[0], [1]])