多种python方法实现矩阵运算

python在做数据处理方面有很大的优势,但是python的运行速度也一直是为诟病的。近期在工作中就遇到了大维度的矩阵乘法的运算,在作为服务时,响应时间略高,工程上需要在不部署其他分布式的前提下,优化运算速度。

接下来用不同的方式计算一个 100002400维 和 240010000维的矩阵并分别输出计算花费的时间。

numpy 方式

	import numpy
	
	aa = np.random.rand(10000, 2400)
	bb = np.random.rand(2400, 10000)
	%timeit cc = np.dot(aa, bb)
	Output: 1 loop, best of 3: 9.21 s per loop

scipy 方式

	import scipy
	
	aa = np.random.rand(10000, 2400)
	bb = np.random.rand(2400, 10000)
	%timeit cc = scipy.dot(aa, bb)
	Output: 1 loop, best of 3: 9.09 s per loop

numpy.multi_dot 方式

	from numpy.linalg import multi_dot
	
	aa = np.random.rand(10000, 2400)
	bb = np.random.rand(2400, 10000)
	%timeit multi_dot([aa, bb])
	Output: 1 loop, best of 3: 10.4 s per loop

以上三种方式实现大维度矩阵乘法的运行时间并没有大的区别,接下来的方式则是笔者在阅读《动手学深度学习》时候学到 mxnet 库时候,想着尝试一下,却有大的发现。

mxnet 实现方式

	import mxnet as mx
	from mxnet import nd
	a = nd.random.randn(10000, 2400)
	b = nd.random.randn(2400, 10000)
	%timeit c = mx.ndarray.dot(a, b)
Output: The slowest run took 6.45 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 62.7 µs per loop

如图中所示,mxnet 方法计算大维度矩阵运算时,效率提高了相当多。

当时因为mxnet.ndarray 可以与 numpy.ndarray 很方便的相互转换

	import numpy as np
	from mxnet import nd

	# np.ndarray -> mx.ndarray
	np_array = np.array([1, 2, 3, 4])
	nd_array = nd.array(np_array)
	
	# mx.ndarray -> np.ndarray
	np_array2 = nd_array.asnumpy()

但是mxnet貌似不支持DataFrame运算,需要两次转化。

你可能感兴趣的:(python)