PythonのMatplotlib＋Seabornを使ったグラフ描画を非Python実行環境のWindowsでプロセス間通信で使う

[以前の記事](https://qiita.com/BLUETREE/items/647cea422c8d2165d2d3)で，PythonのMatplotlib+Seabornのグラフを非Python実行環境のWindowsから.pngを生成するexeを作成した．
しかし，実行時間が長い(4秒)ので，あらかじめ.exeを立ち上げておいて，プロセス間通信で受け付ける方針で作成してみた．

期待される改善としては，
1.importが省略されるため，オーバヘッドの時間が削減される．
2.プロセス間通信なので，ファイルとしてではなくBYTEデータで直接やり取りできる.
　→でもまずは，1.だけのやつを作ります

#プロセス間通信(Scoket通信)
[この記事](https://qiita.com/__init__/items/5c89fa5b37b8c5ed32a4)を参考に，プロセス間通信を作る．
最終的には，データ送信もデータ返信もBYTEで直接授受したいと思うが，まずはトリガだけ別プロセスからやる．

引数付き実行をやめて，Socket通信のClientから指示する方針で．
(シンプルに，カンマ渡しを.split(",")で分離にしています)

###Server側

```py
import socket
#Define the host and port
host = 'localhost'
port = 64123 #適当なport

#socket connect
serversock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

serversock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
serversock.bind((host,port))
serversock.listen(1)

if __name__ == '__main__':
 client_socket, client_address = serversock.accept()

 while True:
     #Message待ち
     rcvMsg = client_socket.recv(2048)

     #Message受信
     print('Receive data : %s' % (rcvMsg))
     rcvMsg = rcvMsg.decode('utf-8').split(',')

     #形式あってるかチェックとかする

     Args1 = rcvMsg[0] 
     Args2 = rcvMsg[1] 
     Args3 = rcvMsg[2] 

     ###処理部記載###

     s_msg = 'Finish'
     s_msg = s_msg.encode('utf-8')
     client_socket.sendall(s_msg)
     print('Send finish')
 client_socket.close()

```

###Client側

```py
import socket

host = 'localhost'  
port = 64123        #任意のLocal Port．Serverに合わせる．

#Socket通信開始
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port)) 

while True:
    print('input command...')
    massage = input().encode('utf-8')    
    
    client.send(massage) 
    response = client.recv(4096) 

    #WhileのBreak条件入れてね    
client.close()
```
こんな感じのServerとClient作って，
Clientからカンマ区切りで電文渡す→Serverで処理実行
といった作りにしました．

#seabornが遅い(-_-;)ので，imshowに変更
せっかくオーバーヘッドがなくなったので，グラフ生成までの[時間を計測](https://qiita.com/fantm21/items/3dc7fbf4e935311488bc)．
まずはPythonでServer＋Client作って動作確認．
0.2～0.4秒くらい.
これでもまぁ使えるけど，欲を言えばもう少し早くしたい．

どこが遅いんじゃー??
###1. seabornでのheatmap生成

```py

def Heatmap(data):

 ax = sns.heatmap(data)

 return ax
```

　　~0.1秒
###2. filesave

```py
plt.savefig(os.path.join(save_path,save_name),facecolor="blue")  
```
　　~0.15秒

まずは１．について調べると，[Seabornは遅い](http://spcx8.hatenablog.com/entry/2018/10/09/070000)ので，Matplotlibのimshowでやることにした．

###3.Matplotlibのimshowでheatmap生成

```py

def HeatMapFast(data):
    plt.figure()
    plt.imshow(data,interpolation='nearest',vmin=0,vmax=15,cmap='rainbow')
    plt.colorbar()
    #bx = plt.show()
    return plt
```

　~0.05
これでheatmap作成部分はいったんOK．

次は2.について．
savefigを実保存せずに，[メモリ上に展開する方法について調査]
(https://qiita.com/kaito__/items/9aa63cccc99261814065)

この方法では実行処理は一切変わらなかった．
グラフを保存する前に行う処理で時間がかかっているようだ．
この部分は今後の課題．

##使用パッケージ，ライブラリ

```py
import time
import socket
import os
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
```

##Server実処理部分参考

```py

#dataは2次元配列の.csvファイル
data = np.loadtxt(load_path,delimiter=",")

#seabornのヒートマップ
hoge = Heatmap(data)
hoge.plot()
plt.savefig(os.path.join(save_path,save_name),facecolor="blue")

#matplotlibのヒートマップ
hogehoge = HeatMapFast(data)
hogehoge.savefig(os.path.join(save_path,save_name2)) 

```


#結果
```
loadCSV:0.000997781753540039[sec]
HeatMap():0.09075665473937988[sec]
SaveFig:0.115692138671875[sec]
HeatMapFast():0.05684828758239746[sec]
SaveFig2:0.13364338874816895[sec]
```
ここまでにはなりました．
HeatMap()がSeaborn，HeatMapFast()がimshowです．
どちらもsavefigと合わせると0.2秒以下ってイメージですね．
もう少し早くしたいなー．

※計測はtime.time()でやっているため，[精度・分解能はあまりよくない](https://qiita.com/takeopy/items/170d0e1ddbf02ef9fbb9)らしい．