#!/usr/bin/env python
# coding: utf-8
# # Table of Contents
#
#
# 行列の計算速度競争
#
#
# cc by Shigeto R. Nishitani, 2017-10-30
#
#
#
# * file: ~/python/jupyter_num_calc/notebooks_python/LA_speed_race.ipynb
#
# Mapleと,C, pythonで競争させてみました.Cはそのままです.Mapleは
# ``` octave
# with(LinearAlgebra):
# data:=[1000,2000,4000];
# for n in data do
# A:=RandomMatrix(n,n,generator = 0..1.0):
# b:=RandomVector(n,generator = 0..1.0):
# st:=time();
# LUDecomposition():
# print(time()-st);
# end:
# ```
#
# です.pythonのcodeは,lapackにあるdgesvを指定して
# 呼び出すようにしています.scipy.laのsolveでは何を使っているかはよくわからないので.
#
# ``` python
# import numpy as np
# import scipy.linalg as la
# import time
#
# sizes = [1000, 2000, 4000]
# for n in sizes:
# A = np.random.random((n, n))
# b = np.random.random((n))
# start = time.time()
# la.lapack.dgesv(A, b)
# print('%s [dim], %10.5f [sec] # python' % (n,time.time()-start))
# ```
#
# 結果は,次の通りです.
#
# |size|Maple[sec]|C[sec]|python[sec]|
# |:----|-----:|-----:|------:|
# |1000 | 0.339|0.0589|0.04101
# |2000 | 1.384|0.3826|0.12682
# |4000 |45.482|3.0111|0.81373
#
# pythonの圧勝ですね.絶対値はあまり意味がありません.MacBook Air(13-inch, Early 2015/2.2GHz Core i7, ElCapitan 10.11.6)ですが,softのversionにもよります.
#
# ただし,どんなrandomを生成しているかで結果は大きく変わるので,ちょっと怪しいです.
# たとえば,MapleのRandomMatrixでgeneratorを指定しないと
# size=1000でも9.773[sec]ととんでもないぐらい時間がかかります.
#
# MapleではさらにRandomMatrixの生成にも時間がかかります.
# MapleではNAGのライブラリを使っているので...
#
# ちなみにrubyでは[SciRuby](https://github.com/SciRuby/nmatrix/wiki/Getting-started)
# に従ってnmatrixをinstallして,
# ```ruby
# require 'nmatrix'
# require 'time'
#
# #n = NMatrix.new(3, [4,9,2,3,5,7,8,1,6], dtype: :float64)
# [1000,2000,4000].each do |size|
# n = size
# aa = NMatrix.random([n,n])
# start = Time.now
# lu = aa.factorize_lu
# p Time.now - start
# end
# ```
#
# 素直に走らせると,
#
# |size|nmatrix[sec]|nmaxtrix/lapacke|
# |:----|-----:|-----:|
# |1000 | 0.2118|0.028607|
# |2000 | 1.9287|0.191315|
# |4000 |16.9059|1.313174|
#
# のnmatrixです.2017/10/28現在nmatrix-0.2.4です.
# やっぱ,Rubyは数値計算苦手なんかと諦めかけたんですが,
#
# ```
# gem install nmatrix nmatrix-lapacke
# ```
#
# して
# ```
# Require 'nmatrix/lapacke'
# ```
#
# すると前表のnmatrix/lapacke欄です.これだと,C版に遜色ないですね.
# nmatrix-lapacke-0.2.3がinstallされています.このあたりの解説が[sciruby](http://sciruby.com/nmatrix/)以外見当たらなくて...
#
#