【问题标题】:Is Vectorious' Matrix.product function faster than Numpy's multiply function?Vectorious 的 Matrix.product 函数是否比 Numpy 的乘法函数更快?
【发布时间】:2018-03-20 15:39:50
【问题描述】:

我一直在研究是否应该在 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])

【问题讨论】:

  • 我对 NodeJS 不熟悉。 matrixA.product(matrixB) 是否将结果放回 matrixA?在这种情况下,我想它会更快,因为操作是就地执行的,而np.multiply 需要为matrixC 分配内存。您可以通过预先分配 matrixC 并将其与 out=matrixC 一起传递给函数来使比较更公平。 (或者在 NodeJS 中使用非就地版本的乘法,哪个更适合您的需求。)
  • 我更新了 Numpy 测试以使用以下两行: 在性能计数器之外:matrixC = np.random.uniform(0, 10, (size,size)) |性能计数器内部:np.multiply(matrixA, matrixB, out=matrixC) 这些更改导致所需时间增加了约 20 秒。

标签: python node.js performance numpy matrix


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2012-04-03
    • 2016-10-10
    相关资源
    最近更新 更多