2017-10-09 206 views
0

我一直在研究是否应该在NodeJS或Python中执行一些数据工作。我创建了几个测试,这些测试似乎表明NodeJS使用的Vectorious模块可以以比Python的Numpy模块更快的速度执行矩阵操作。是Vectorious的'Matrix.product函数比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

我不熟悉NodeJS。 'matrixA.product(matrixB)'把结果放回'matrixA'吗?在这种情况下,我认为它更快,因为操作是在原地执行的,而'np.multiply'需要为'matrixC'分配内存。您可以通过预先分配'matrixC'并将其与'out = matrixC'传递给函数来使比较更加公平。 (或者使用NodeJS中不相应的乘法版本,以适合您的需求为准)。 – kazemakase

+0

我更新了Numpy测试以使用以下两行: 在perf计数器之外:'matrixC = np.random.uniform (0,10,(size,size))'|在perf计数器内:'np.multiply(matrixA,matrixB,out = matrixC)' 这些更改导致额外增加了约20秒的时间。 – Base13

回答

0

修改以多种方式,包括多个连续处决和这两个测试后在Node.js和Python的静态和原型驱动方法之间旋转,我确定:

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

希望这可以帮助别人决定在哪一种语言上投入开发时间来进行元素级乘法运算。我很好奇为什么Numpy的out参数导致执行速度慢,因为它指向一个现有的对象。