IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

matplotlib sous PyQt5 un peu lent


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut matplotlib sous PyQt5 un peu lent
    Bonjour,
    ci dessous, un code qui me permet d'afficher un graphique (via matplotlib) dans une fenêtre remplie d'objet (via PyQt5).
    jusque là pas de soucis, j'arrive à faire afficher les objets que je veux...

    Pour l'instant, ce qu'affiche le graphique est une série de valeur aléatoire directement générée par python lui même... mais à terme cela représentera des signaux bien particuliers. que j'aimerais pouvoir observer en continu...

    le truc c'est que j'aurais aimer avoir un taux de rafraichissement (du graphique) d'environ 100Hz (100 points à la secondes)... et là le programme tel qu'il est plafonne (sur mon ordi) à 8-10 points secondes.
    j'ai essayé de fixer les axes du graphique (la ligne est en commentaire d'ailleurs) mais cela ne semble pas avoir de grands effets...

    est-ce qu'il y a des voies d'améliorations possibles pour optimiser tout ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import sys
    from random import randrange
    import matplotlib
    #matplotlib.use("Qt5Agg")
    import time
    from PyQt5 import QtCore
    from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget
    from numpy import arange, sin, pi
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt, QTimer)
    from PyQt5.QtWidgets import (QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem,
                                 QGridLayout, QVBoxLayout, QHBoxLayout, QSizePolicy,
                                 QLabel, QLineEdit, QPushButton)
     
     
    class MainWindow(FigureCanvas):
        def __init__(self, parent=None, width=4, height=3, dpi=100):
            fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = fig.add_subplot(111)
            self.axes.hold(False)
            super(MainWindow, self).__init__(fig)
            self.setParent(parent)
            FigureCanvas.setSizePolicy(self,QSizePolicy.Expanding,QSizePolicy.Expanding)
            FigureCanvas.setFixedSize(self,400,400)
            timer = QTimer(self)
            self.setWindowTitle("Mesures")
            timer.timeout.connect(self.update_figure)
     
        def update_figure(self):
            pass
     
    class MyDynamicMplCanvas(MainWindow):
        a=2
        liste_x=[0,0]
        liste_y=[0,0]
        tstart=time.time()
        def __init__(self, *args, **kwargs):
            MainWindow.__init__(self, *args, **kwargs)
            timer = QtCore.QTimer(self)
            timer.timeout.connect(self.update_figure)
            timer.start(250)
     
        def update_figure(self):
            self.a=self.a+1
            self.liste_x.extend([self.a])
            self.liste_y.extend([randrange(0,5)])
            self.axes.plot(self.liste_x, self.liste_y)
            #self.axes.axis([0,250,0,6])
            print(time.time()-self.tstart)
            self.draw()
     
    class ApplicationWindow(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
            self.setWindowTitle("application main window")
            self.main_widget = QWidget(self)
     
            layout1 = QVBoxLayout(self.main_widget)
            layout2 = QHBoxLayout(self.main_widget)
            dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
            self.bouton1=QPushButton()
            self.bouton2=QPushButton()
            self.bouton3=QPushButton()
            layout1.addLayout(layout2)
     
            layout1.addWidget(self.bouton1)
            layout2.addWidget(self.bouton2)
            layout2.addWidget(self.bouton3)
            layout2.addWidget(dc)
     
     
            self.main_widget.setFocus()
            self.setCentralWidget(self.main_widget)
     
        def fileQuit(self):
            self.close()
     
        def closeEvent(self, ce):
            self.fileQuit()
     
        def about(self):
            QMessageBox.about(self, "About",)
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        aw = ApplicationWindow()
        aw.setWindowTitle("PyQt5 Matplot Example")
        aw.show()
        app.exec_()

  2. #2
    dsy
    dsy est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 105
    Points : 142
    Points
    142
    Par défaut
    Salut
    plutôt que faire des hypothèses comme "c'est à cause de matplotlib", je ferais un profiling du code. C'est facile en Python grâce à cProfile :
    https://docs.python.org/3/library/profile.html
    https://pymotw.com/2/profile/

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,
    merci pour l'idée d'utiliser un profiling, je ne savais pas qu'il y avait des choses dédiées à cela...

    j'utilisais jusqu'à maintenant un timer que j'enregistrais dans un tableau (ou que j'affichais directement via un print())... cela me permettait de me faire une idée du temps nécessaire pour chaque ligne... mais cProfile a l'air plus puissant!

Discussions similaires

  1. fonction récursive un peu lente
    Par shaku dans le forum Macros et VBA Excel
    Réponses: 69
    Dernier message: 29/11/2008, 01h15
  2. Mon blog est un peu lent
    Par elitost dans le forum Mon site
    Réponses: 7
    Dernier message: 05/05/2008, 00h24
  3. Ubuntu un peu lent au chargement chez vous aussi ?
    Par elitost dans le forum Ubuntu
    Réponses: 10
    Dernier message: 12/09/2007, 22h45
  4. Pourquoi surfer sous linux est plus lent sous suse
    Par spiwis dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 12/12/2005, 12h21
  5. Programme un peu lent
    Par gege2061 dans le forum GTK+
    Réponses: 4
    Dernier message: 08/07/2004, 17h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo