今回はJavaとpythonの速度を転置行列を生成することで比較してみたいと思います。
Javaのバージョンとかpythonのバージョンとか実行マシンとか何も載せていないので、あくまで参考と思ってください。
目次
比較方法
3000×4000行列を生成し、その転置行列を生成するまでの時間をナノ秒で計測する。
Python 通常配列
import time
class Mat:
def __init__(self,n,m) -> None:
self.n = n
self.m = m
self.mat = [[i+1+j*self.n for i in range(self.n)] for j in range(self.m)]
def transpose(self,):
return [[self.mat[i][j] for i in range(len(self.mat))] for j in range(len(self.mat[0]))]
t0 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
mat = Mat(3000,4000)
A = mat.transpose()
t1 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
print(t1-t0)実行結果
3101864000 (ns)Python ndarray
import time
import numpy as np
class Mat:
def __init__(self,n,m) -> None:
self.n = n
self.m = m
self.mat = [[i+1+j*self.n for i in range(self.n)] for j in range(self.m)]
def transpose(self,):
A = np.array(self.mat)
return A.transpose()
t0 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
mat = Mat(3000,4000)
A = mat.transpose()
t1 = time.clock_gettime_ns(time.CLOCK_MONOTONIC)
print(t1-t0)実行結果
2166542000(ns)Java
Java + 2DArray
元から次元がわかっているので、高速な2DArrayを使用します。
public class Mat {
int[][] array;
int n;
int m;
public static void main(String[] args){
double t0 = System.nanoTime();
Mat mat = new Mat(3000,4000);
mat.setArray();
mat.transpose();
double t1 = System.nanoTime();
System.out.println(t1-t0);
}
public Mat(int n, int m){
this.n = n;
this.m = m;
array = new int[m][n];
}
public void setArray(){
for (int i = 0;i<n;i++){
for (int j = 0;j<m;j++){
array[j][i] = 1+j*n + i;
}
}
}
public void transpose(){
int[][] tmpArray = new int[n][m];
for (int i = 0;i<n;i++){
for (int j = 0;j<m;j++){
tmpArray[i][j] = array[j][i];
}
}
array = tmpArray;
}
}実行結果
6.8755125E7pythonの通常配列の50倍くらい高速です。

