是矢量' Matrix.product函数比Numpy的乘法函数更快?

时间:2017-10-09 12:18:00

标签: python node.js performance numpy matrix

我一直在研究是否应该在NodeJS或Python中执行一些数据工作。我创建了几个测试,似乎表明NodeJS使用的Vectorious模块可以比Python的Numpy模块更快的速度执行矩阵操作。

下面是我编写的两个测试,用于测试模块之间的元素乘法。我想知道:

  • 我是否正确设计了这些测试?据我所知,这类测试可能涉及大量复杂问题。
  • 如果这些测试设计正确,那么数据空间中如何强调Numpy的使用?
  • 无论结果如何,一个人如何胜过另一个?

我理解第二和第三个问题可能会产生非常明确的答案,我更关注第一个问题,因为这会推动未来的发展。

NodeJS元素乘法测试:

const v = require('vectorious'),
    Matrix = v.Matrix;

const size = 25000;

console.log("NodeJS: Creating matrices...")
let matrixA = Matrix.random(size, size);
console.log("NodeJS: Matrix A created.")
let matrixB = Matrix.random(size, size);
console.log("NodeJS: Matrix B created.")

console.log("NodeJS: Starting... (matrixA(0,0):" + matrixA.get(0, 0) + ")(matrixA(24999,24999):" + matrixA.get(24999, 24999) + ")")
t = process.hrtime()
matrixA.product(matrixB)
t2 = process.hrtime(t);

console.log("%s %d seconds and %d nanoseconds", "NodeJS: Duration", t2[0], t2[1]);
console.log(matrixA.get(0, 0) + " | " + matrixB.get(0, 0))
console.log(matrixA.get(24999, 24999) + " | " + matrixB.get(24999, 24999))

Python元素乘法测试:

import numpy as np
import time

size = 25000

print("Python: Creating matrices...")
matrix = np.random.uniform(0, 10, (size,size))
print("Python: Created matrix A.")
matrixB = np.random.uniform(0, 10, (size,size))
print("Python: Created matrix B.")

print("Starting matrix multiplication...")

start = time.perf_counter()
matrixC = np.multiply(matrix, matrixB)
end = time.perf_counter()

elapsed = end - start
print("elapsed time = {:.12f} seconds".format(elapsed))

print("-", matrix[0])
print("-", matrixC[0])

1 个答案:

答案 0 :(得分:0)

在以多种方式修改这两个测试之后,包括多个顺序执行以及Node.js和Python的静态和原型驱动方法之间的旋转,我已经确定:

  • Node.js原型变体是最快的,但仅适用于第一次迭代。之后执行平均值约为30秒(采样速度为Numpy,带有out参数),用于两个25,000x25,000矩阵之间的元素乘法。
  • 对于两个25,000x25,000矩阵之间的元素乘法,Numpy静态方法在14秒左右的性能平均中是最一致的。我将把Numpy用于未来的数据驱动应用程序。

希望在决定使用哪种语言为元素乘法运算投入开发时间时,这可以帮助其他人。我很好奇为什么Numpy的out参数会导致执行速度变慢,因为它引用了一个现有的对象。