Utilisation du dessin de graphique à l'aide de Matplotlib + Seaborn de Python pour la communication inter-processus sous Windows, un environnement d'exécution non Python

Dans Article précédent, j'ai créé un exe qui génère un .png à partir de l'environnement d'exécution non Python Windows pour le graphique de Matplotlib + Seaborn en Python. Cependant, comme le temps d'exécution est long (4 secondes), j'ai démarré .exe à l'avance et l'ai créé avec la politique d'accepter la communication entre les processus.

L'amélioration attendue est 1.Le temps de surcharge est réduit car l'importation est omise. 2. Puisqu'il s'agit d'une communication inter-processus, elle peut être échangée directement avec des données BYTE plutôt que sous forme de fichier. → Mais d'abord, ne faites que celui en 1.

Communication inter-processus (communication socket)

Créez une communication inter-processus en vous référant à cet article. En fin de compte, je voudrais envoyer et recevoir la transmission de données et la réponse de données directement avec BYTE, mais d'abord je ne ferai que le déclencheur d'un autre processus.

La politique est d'arrêter l'exécution avec des arguments et d'instruire du client de communication de socket. (Simplement, la virgule qui passe est séparée par .split (","))

Du côté serveur

import socket
#Define the host and port
host = 'localhost'
port = 64123 #Port approprié

#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:
     #En attente de message
     rcvMsg = client_socket.recv(2048)

     #Réception des messages
     print('Receive data : %s' % (rcvMsg))
     rcvMsg = rcvMsg.decode('utf-8').split(',')

     #Vérifiez si le format est correct

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

     ###Description de la section de traitement###

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

Côté client

import socket

host = 'localhost'  
port = 64123        #Tout port local. Match avec le serveur.

#Communication de socket démarrée
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) 

    #Veuillez saisir la condition de pause de While
client.close()

Créez un serveur et un client comme celui-ci, Envoyer le message du client séparé par des virgules → Exécuter le traitement sur le serveur Je l'ai fait comme ça.

seaborn est lent (-_-;), alors changez pour imshow

Puisque la surcharge a été éliminée, [Mesurer le temps] jusqu'à ce que le graphique soit généré (https://qiita.com/fantm21/items/3dc7fbf4e935311488bc). Tout d'abord, créez Serveur + Client avec Python et vérifiez l'opération. Environ 0,2-0,4 secondes. Cela peut toujours être utilisé, mais si vous le souhaitez, je veux le rendre un peu plus rapide.

Où est-ce lent ??

1. Génération de Heatmap dans Seaborn


def Heatmap(data):

 ax = sns.heatmap(data)

 return ax

~ 0,1 seconde 2. filesave

plt.savefig(os.path.join(save_path,save_name),facecolor="blue")  

~ 0,15 seconde

Tout d'abord, 1. J'ai découvert que Seaborn est lent, alors j'ai décidé de le faire avec imshow de Matplotlib.

3. Générer une carte thermique avec imshow de Matplotlib


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 Avec cela, la partie de création de la carte thermique est OK une fois.

Le suivant est d'environ 2. [Étude de l'extension de la mémoire] sans réellement enregistrer savefig (https://qiita.com/kaito__/items/9aa63cccc99261814065)

Cette méthode n'a pas du tout changé le processus d'exécution. Il semble qu'il faut du temps pour effectuer le processus avant d'enregistrer le graphique. Cette partie est une tâche future.

Paquets et bibliothèques utilisés

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

Référence de la pièce de traitement réelle du serveur


#les données sont un tableau à deux dimensions.fichier csv
data = np.loadtxt(load_path,delimiter=",")

#carte de chaleur Seaborn
hoge = Heatmap(data)
hoge.plot()
plt.savefig(os.path.join(save_path,save_name),facecolor="blue")

#carte thermique matplotlib
hogehoge = HeatMapFast(data)
hogehoge.savefig(os.path.join(save_path,save_name2)) 

résultat

loadCSV:0.000997781753540039[sec]
HeatMap():0.09075665473937988[sec]
SaveFig:0.115692138671875[sec]
HeatMapFast():0.05684828758239746[sec]
SaveFig2:0.13364338874816895[sec]

C'est tout. HeatMap () est Seaborn et HeatMapFast () est imshow. Les deux ont une image de 0,2 seconde ou moins lorsqu'ils sont combinés avec savefig. Je veux faire un peu plus vite.

Recommended Posts

Utilisation du dessin de graphique à l'aide de Matplotlib + Seaborn de Python pour la communication inter-processus sous Windows, un environnement d'exécution non Python
Utilisation du dessin de graphe à l'aide de Matplotlib + Seaborn de Python sous Windows, un environnement d'exécution non Python
Créez simplement un environnement d'exécution Python 3 sous Windows
Dessin graphique avec matplotlib
Jusqu'à dessiner un graphe 3D avec Python dans Windows10
Procédure de création d'un environnement CDK sous Windows (Python)
Concurrence avec VS Code Créez un environnement Python pour les professionnels sous Windows
Créer un environnement d'exécution Windows Python avec VScode + Remote WSL
Créer un environnement Linux sur Windows 10
[Definitive Edition] Création d'un environnement d'apprentissage "machine learning" à l'aide de Python sous Windows
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Environnement de programmation pour les débutants réalisé avec Windows
Comment dessiner un graphique avec Matplotlib
J'ai construit un environnement TensorFlow avec windows10
Exécutez matplotlib sur un conteneur Windows Docker
Création d'un environnement pour "Tello_Video" sous Windows
Un outil pour créer des liens symboliques sous Windows
Construire l'environnement Python3.5 + matplotlib sur Ubuntu 12 en utilisant Anaconda
Créer un environnement pour matplotlib + cartopy sur un Mac
Créer un environnement Kubernetes pour le développement sur Ubuntu
Remarques sur l'utilisation de TensorFlow sur Bash sur Ubuntu sous Windows
Créer un environnement d'exécution Python sur IBM i
Comment créer un environnement d'exécution virtuelle pour Python à l'aide de Visual Studio Code et de pipenv sur une machine Windows (également le notebook Jupyter)