Qt圖表繪制(QtCharts)- 性能優化(13)

文章目錄

    • 1 批量替換代替追加
      • 1.1 測試1
      • 1.2 測試2
      • 1.3 測試3
    • 2 開啟OpenGL
      • 2.1 測試1
      • 2.2 測試2
      • 2.3 測試3
      • 2.4 測試4


更多精彩內容
👉內容導航 👈
👉Qt開發 👈
👉QtCharts繪圖 👈
👉python開發 👈

1 批量替換代替追加

環境說明
系統windows10
python3.13
pyside66.8.3
性能分析工具line_profiler_pycharm
  • 如下所示,使用replace添加數據和使用append添加數據性能對比,單次添加數據越多,replace性能比append越強

  • 示例代碼

    import random  # 導入random模塊,用于生成隨機數
    import sysfrom PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis  # 導入QtCharts模塊,用于創建圖表和軸
    from PySide6.QtCore import QTimer  # 導入QTimer,用于定時更新圖表
    from PySide6.QtCore import Qt  # 導入Qt核心模塊,用于設置對齊方式等
    from PySide6.QtGui import QPainter  # 導入QPainter,用于設置圖表的渲染提示
    from PySide6.QtWidgets import QApplication, QMainWindow  # 導入PySide6的QApplication和QMainWindow類
    from line_profiler_pycharm import profile
    from PySide6.QtCore import QPointFclass MainWindow(QMainWindow):  # 定義MainWindow類,繼承自QMainWindowdef __init__(self):super().__init__()  # 調用父類的構造函數self.setWindowTitle("PySide6 折線圖示例")  # 設置窗口標題self.setGeometry(100, 100, 800, 600)  # 設置窗口的位置和大小self.timer = QTimer()  # 創建一個定時器self.timer.timeout.connect(self.update_chart)  # 連接定時器超時信號到update_chart方法self.timer.start(10)  # 設置定時器間隔為10毫秒,并啟動定時器# print(help(QChart))  # 這行代碼可以用于打印QChart類的幫助信息,目前被注釋掉了self.chart_view = None  # 初始化圖表視圖為Noneself.series1 = QLineSeries()  # 創建一個折線序列對象self.series2 = QLineSeries()  # 創建一個折線序列對象# self.series1.setUseOpenGL(True)  # 設置折線序列使用OpenGL渲染# self.series2.setUseOpenGL(True)  # 設置折線序列使用OpenGL渲染self.init_chart()  # 調用初始化圖表的方法def init_chart(self):  # 定義初始化圖表的方法# 設置名稱self.series1.setName("series1")  # 設置折線的名稱self.series2.setName("series2")  # 設置折線的名稱# 創建圖表chart = QChart()  # 創建一個圖表對象chart.addSeries(self.series1)  # 將折線序列添加到圖表中chart.addSeries(self.series2)  # 將折線序列添加到圖表中chart.setTitle("簡單的折線圖")  # 設置圖表的標題# chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)  # 設置圖表不使用動畫# 創建x軸和y軸axis_x = QValueAxis()  # 創建一個數值型x軸axis_y = QValueAxis()  # 創建一個數值型y軸chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)  # 將x軸添加到圖表底部chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)  # 將y軸添加到圖表左側self.series1.attachAxis(axis_x)  # 將折線序列附著到x軸self.series1.attachAxis(axis_y)  # 將折線序列附著到y軸self.series2.attachAxis(axis_x)  # 將折線序列附著到x軸self.series2.attachAxis(axis_y)  # 將折線序列附著到y軸# 創建圖表視圖self.chart_view = QChartView(chart)  # 創建一個圖表視圖對象,并將圖表添加進去self.chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)  # 設置圖表視圖的渲染提示為抗鋸齒# 設置主窗口的中心部件self.setCentralWidget(self.chart_view)  # 設置主窗口的中心部件為圖表視圖@profiledef update_chart1(self):  # 定義更新圖表的方法"""使用append方法更新折線序列:return: """for i in range(10):  # 循環10次random_integer = random.randint(1, 100)  # 生成一個1到100之間的隨機整數self.series1.append(self.series1.count(), random_integer)  # 將新的點添加到折線序列中chart = self.chart_view.chart()  # 獲取圖表視圖中的圖表對象axis_x = chart.axes(Qt.Orientation.Horizontal)[0]  # 獲取圖表中的x軸對象axis_y = chart.axes(Qt.Orientation.Vertical)[0]  # 獲取圖表中的y軸對象axis_x.setRange(0, self.series1.count())  # 設置x軸的范圍,使其從0到當前折線序列點的數量axis_y.setRange(0, 100)  # 設置y軸的范圍,使其從0到100@profiledef update_chart2(self):  """使用replace方法更新折線序列:return: """data = self.series2.points()for i in range(10):  # 循環10次random_integer = random.randint(1, 100)  # 生成一個1到100之間的隨機整數data.append(QPointF(len(data), random_integer))  # 將新的點添加到折線序列中self.series2.replace(data)  # 替換折線序列中的點chart = self.chart_view.chart()  # 獲取圖表視圖中的圖表對象axis_x = chart.axes(Qt.Orientation.Horizontal)[0]  # 獲取圖表中的x軸對象axis_y = chart.axes(Qt.Orientation.Vertical)[0]  # 獲取圖表中的y軸對象axis_x.setRange(0, self.series2.count())  # 設置x軸的范圍,使其從0到當前折線序列點的數量axis_y.setRange(0, 100)  # 設置y軸的范圍,使其從0到100@profiledef update_chart(self):  # 定義更新圖表的方法self.update_chart1()  # 調用更新圖表的方法self.update_chart2()  # 調用更新圖表的方法if __name__ == "__main__":  # 確保只有在直接運行此腳本時才會執行下面的代碼app = QApplication(sys.argv)  # 創建一個QApplication對象window = MainWindow()  # 創建一個MainWindow對象window.show()  # 顯示主窗口sys.exit(app.exec())  # 進入應用程序的主循環,并等待退出

1.1 測試1

  • 測試方法:定時器1秒刷新1次,每次在循環中添加10個點數據;
  • 測試結果:
    • 從整個函數看update_chart1耗時是update_chart2的6.5倍;
    • 從單行代碼看append耗時是replace的11.3倍;

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

1.2 測試2

  • 測試方法:定時器1秒刷新1次,每次在循環中添加1000個點數據;
  • 測試結果:
    • 從整個函數看update_chart1耗時是update_chart2的199倍;
    • 從單行代碼看append耗時是replace的750倍;

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

1.3 測試3

  • 測試方法:定時器10毫秒刷新1次,每次在循環中添加10個點數據;
  • 測試結果:
    • 從整個函數看update_chart1耗時是update_chart2的5.57倍;
    • 從單行代碼看append耗時是replace的8.82倍;

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2 開啟OpenGL

環境說明
系統windows10
python3.13
pyside66.8.3
性能分析工具line_profiler_pycharm
  • 如下所示,對比開啟OpenGL和開啟OpenGL的性能區別;當使用appeng添加數據時,開啟opengl和不開opengl的區別最大;

  • 示例代碼:

    import random  # 導入random模塊,用于生成隨機數
    import sysfrom PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis  # 導入QtCharts模塊,用于創建圖表和軸
    from PySide6.QtCore import QTimer  # 導入QTimer,用于定時更新圖表
    from PySide6.QtCore import Qt  # 導入Qt核心模塊,用于設置對齊方式等
    from PySide6.QtGui import QPainter  # 導入QPainter,用于設置圖表的渲染提示
    from PySide6.QtWidgets import QApplication, QMainWindow  # 導入PySide6的QApplication和QMainWindow類
    from line_profiler_pycharm import profile
    from PySide6.QtCore import QPointFclass MainWindow(QMainWindow):  # 定義MainWindow類,繼承自QMainWindowdef __init__(self):super().__init__()  # 調用父類的構造函數self.setWindowTitle("PySide6 折線圖示例")  # 設置窗口標題self.setGeometry(100, 100, 800, 600)  # 設置窗口的位置和大小self.timer = QTimer()  # 創建一個定時器self.timer.timeout.connect(self.update_chart)  # 連接定時器超時信號到update_chart方法self.timer.start(1000)  # 設置定時器間隔為10毫秒,并啟動定時器self.chart_view = None  # 初始化圖表視圖為Noneself.series1 = QLineSeries()  # 創建一個折線序列對象self.series2 = QLineSeries()  # 創建一個折線序列對象self.series1.setUseOpenGL(True)  # 設置折線序列使用OpenGL渲染# self.series2.setUseOpenGL(True)  # 設置折線序列使用OpenGL渲染self.init_chart()  # 調用初始化圖表的方法def init_chart(self):  # 定義初始化圖表的方法# 設置名稱self.series1.setName("series1")  # 設置折線的名稱self.series2.setName("series2")  # 設置折線的名稱# 創建圖表chart = QChart()  # 創建一個圖表對象chart.addSeries(self.series1)  # 將折線序列添加到圖表中chart.addSeries(self.series2)  # 將折線序列添加到圖表中chart.setTitle("簡單的折線圖")  # 設置圖表的標題# chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)  # 設置圖表不使用動畫# 創建x軸和y軸axis_x = QValueAxis()  # 創建一個數值型x軸axis_y = QValueAxis()  # 創建一個數值型y軸axis_y.setRange(0, 100)  # 設置y軸的范圍,使其從0到100chart.addAxis(axis_x, Qt.AlignmentFlag.AlignBottom)  # 將x軸添加到圖表底部chart.addAxis(axis_y, Qt.AlignmentFlag.AlignLeft)  # 將y軸添加到圖表左側self.series1.attachAxis(axis_x)  # 將折線序列附著到x軸self.series1.attachAxis(axis_y)  # 將折線序列附著到y軸self.series2.attachAxis(axis_x)  # 將折線序列附著到x軸self.series2.attachAxis(axis_y)  # 將折線序列附著到y軸# 創建圖表視圖self.chart_view = QChartView(chart)  # 創建一個圖表視圖對象,并將圖表添加進去self.chart_view.setRenderHint(QPainter.RenderHint.Antialiasing)  # 設置圖表視圖的渲染提示為抗鋸齒# 設置主窗口的中心部件self.setCentralWidget(self.chart_view)  # 設置主窗口的中心部件為圖表視圖@profiledef update_chart1(self):  # 定義更新圖表的方法"""開啟OpenGL渲染,使用append方法更新折線序列:return:"""for i in range(10):  # 循環10次random_integer = random.randint(1, 100)  # 生成一個1到100之間的隨機整數self.series1.append(self.series1.count(), random_integer)  # 將新的點添加到折線序列中@profiledef update_chart2(self):"""不開啟OpenGL渲染,使用append方法更新折線序列:return:"""for i in range(10):  # 循環10次random_integer = random.randint(1, 100)  # 生成一個1到100之間的隨機整數self.series2.append(self.series2.count(), random_integer)  # 將新的點添加到折線序列中@profiledef update_chart(self):  # 定義更新圖表的方法self.update_chart1()  # 調用更新圖表的方法self.update_chart2()  # 調用更新圖表的方法chart = self.chart_view.chart()  # 獲取圖表視圖中的圖表對象axis_x = chart.axes(Qt.Orientation.Horizontal)[0]  # 獲取圖表中的x軸對象max_x = self.series2.count()axis_x.setRange(0, max_x)  # 設置x軸的范圍,使其從0到當前折線序列點的數量if __name__ == "__main__":  # 確保只有在直接運行此腳本時才會執行下面的代碼app = QApplication(sys.argv)  # 創建一個QApplication對象window = MainWindow()  # 創建一個MainWindow對象window.show()  # 顯示主窗口sys.exit(app.exec())  # 進入應用程序的主循環,并等待退出

2.1 測試1

  • 測試方法:定時器1秒刷新1次,每次在循環中添加10個點數據;
  • 測試結果:
    • 從整個函數看update_chart2耗時是update_chart1的9.7倍;
    • 從單行代碼看append添加數據不開啟opengl耗時是開啟opengl的21.3倍;

在這里插入圖片描述

2.2 測試2

  • 測試方法:定時器1秒刷新1次,每次在循環中添加1000個點數據;
  • 測試結果:
    • 從整個函數看update_chart2耗時是update_chart1的123倍;
    • 從單行代碼看append添加數據不開啟opengl耗時是開啟opengl的169倍;

在這里插入圖片描述

2.3 測試3

  • 測試方法:定時器10毫秒刷新1次,每次在循環中添加10個點數據;
  • 測試結果:
    • 從整個函數看update_chart2耗時是update_chart1的72.5倍;
    • 從單行代碼看append添加數據不開啟opengl耗時是開啟opengl的113倍;

在這里插入圖片描述

2.4 測試4

  • 測試方法:將使用append添加數據改為使用replace添加數據,定時器10毫秒刷新1次,每次在循環中添加10個點數據;

  • 測試結果:

    • 從整個函數看update_chart2耗時是update_chart1的1.84倍;
    • 從單行代碼看replace添加數據不開啟opengl耗時是開啟opengl的11倍;
  • 測試代碼:

        @profiledef update_chart1(self):  # 定義更新圖表的方法"""開啟OpenGL渲染,使用append方法更新折線序列:return:"""data = self.series1.points()for i in range(10):  # 循環10次random_integer = random.randint(1, 100)  # 生成一個1到100之間的隨機整數data.append(QPointF(len(data), random_integer))  # 將新的點添加到折線序列中self.series1.replace(data)  # 替換折線序列中的點@profiledef update_chart2(self):"""不開啟OpenGL渲染,使用append方法更新折線序列:return:"""data = self.series2.points()for i in range(10):  # 循環10次random_integer = random.randint(1, 100)  # 生成一個1到100之間的隨機整數data.append(QPointF(len(data), random_integer))  # 將新的點添加到折線序列中self.series2.replace(data)  # 替換折線序列中的點
    

在這里插入圖片描述



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905775.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式故障碼管理系統設計實現

文章目錄 前言一、故障碼管理系統概述二、核心數據結構設計2.1 故障嚴重等級定義2.2 模塊 ID 定義2.3 故障代碼結構2.4 故障記錄結構 三、故障管理核心功能實現3.1 初始化功能3.2 故障記錄功能3.3 記錄查詢與清除功能3.4 系統自檢功能 四、故障存儲實現4.1 Flash 存儲實現4.2 R…

動態規劃-63.不同路徑II-力扣(LeetCode)

一、題目解析 與62.不同路徑不同的一點是現在網格中有了障礙物,其他的并沒有什么不同 二、算法解析 1.狀態表示 dp[i][j]表示:到[i,j]位置時,不同的路徑數 2.狀態轉移方程 由于多了障礙物,所以我們要判斷是否遇到障礙物 3.初…

使用CherryStudio +SiliconFlow 部署獨立的deepseek+知識庫

deepseek知識庫,獨立的deepseek 首先我們先了解 CherryStudio?SiliconFlow? CherryStudio是一個支持多平臺的AI客戶端,我們致力于讓更多人能夠享受到AI帶來的便利。 簡單來說,它是一個能讓普通人輕松用上AI 的「萬能工…

Openshift節點Disk pressure

OpenShift 監控以下指標,并定義以下垃圾回收的驅逐閾值。請參閱產品文檔以更改任何驅逐值。 nodefs.available 從 cadvisor 來看,該node.stats.fs.available指標表示節點文件系統(所在位置)上有多少可用(剩余&#xf…

MySQL的 JOIN 優化終極指南

目錄 前言序章:為何要有JOIN?——“一個好漢三個幫”的數據庫哲學 🤝第一章:JOIN的“七十二變”——常見JOIN類型速覽 🎭第二章:MySQL的“紅娘秘籍”——JOIN執行原理大揭秘 🕵??♀?&#x1…

TLS 1.3黑魔法:從協議破解到極致性能調優

一、TLS協議逆向工程實驗 1.1 密碼學套件破解劇場 實驗準備: 靶機:啟用TLS 1.2的Nginx服務器 工具集:Wireshark OpenSSL s_client 定制Python腳本 實戰攻擊復現: # 強制使用弱加密套件連接 openssl s_client -connect exa…

國標GB/T 12536-90滑行試驗全解析:純電動輕卡行駛阻力模型參數精準標定

摘要 本文以國標GB/T 12536-90為核心框架,深度解析純電動輕卡滑行試驗的完整流程與數據建模方法,提供: 法規級試驗規范:從環境要求到數據采集全流程詳解行駛阻力模型精準標定:最小二乘法求解 ( FAv^2BvC ) 的MATLAB實…

【GaussDB遷移攻略】DRS支持CDC,解決大規模數據遷移挑戰

目錄 1 背景介紹 2 CDC的實現原理 3 DRS的CDC實現方式 4 DRS的CDC使用介紹 5 總結 1 背景介紹 隨著國內各大行業數字化轉型的加速,客戶的數據同步需求越來越復雜。特別是當需要將一個源數據庫的數據同時遷移到不同的目標庫場景時,華為云通常會創建…

PSA Certified

Arm 推出的 PSA Certified 已成為安全芯片設計領域的黃金標準。通過對安全啟動、加密服務以及更新協議等方面制定全面的要求,PSA Certified為芯片制造商提供了清晰的路線圖,使其能將安全機制深植于定制芯片解決方案的基礎架構中。作為對PSA Certified的補…

游戲引擎學習第286天:開始解耦實體行為

回顧并為今天的內容定下基調 我們目前正在進入實體系統的一個新階段,之前我們已經讓實體的移動系統變得更加靈活,現在我們想把這個思路繼續延伸到實體系統的更深層次。今天的重點,是重新審視我們處理實體類型(entity type&#x…

遙感圖像非法采礦礦區識別分割數據集labelme格式1818張3類別

數據集格式:labelme格式(不包含mask文件,僅僅包含jpg圖片和對應的json文件) 圖片數量(jpg文件個數):1818 標注數量(json文件個數):1818 標注類別數:3 標注類別名稱:["river","illegal-mining"…

python爬蟲實戰訓練

前言:哇,今天終于能訪問豆瓣了,前幾天爬太多次了,網頁都不讓我訪問了(要登錄)。 先來個小練習試試手吧! 爬取豆瓣第一頁(多頁同上篇文章)所有電影的排名、電影名稱、星…

Go語言實現生產者-消費者問題的多種方法

Go語言實現生產者-消費者問題的多種方法 生產者-消費者問題是并發編程中的經典問題,涉及多個生產者生成數據,多個消費者消費數據,二者通過緩沖區(隊列)進行協調,保證數據的正確傳遞和同步。本文將從簡單到…

【Opencv】canny邊緣檢測提取中心坐標

采用opencv 對圖像中的小球通過canny邊緣檢測的方式進行提取坐標 本文介紹了如何使用OpenCV對圖像中的小球進行Canny邊緣檢測,并通過Zernike矩進行亞像素邊緣檢測,最終擬合橢圓以獲取小球的精確坐標。首先,圖像被轉換為灰度圖并進行高斯平滑…

藍橋杯12屆國B 123

題目描述 小藍發現了一個有趣的數列,這個數列的前幾項如下: 1,1,2,1,2,3,1,2,3,4,? 小藍發現,這個數列前 1 項是整數 1,接下來 2 項是整數 1 至 2,接下來 3 項是整數 1 至 3,接下來 4 項是整數 1 至 4&…

鴻蒙OSUniApp 制作動態加載的瀑布流布局#三方框架 #Uniapp

使用 UniApp 制作動態加載的瀑布流布局 前言 最近在開發一個小程序項目時,遇到了需要實現瀑布流布局的需求。眾所周知,瀑布流布局在展示不規則尺寸內容(如圖片、商品卡片等)時非常美觀和實用。但在實際開發過程中,我…

ThinkStation圖形工作站進入BIOS方法

首先視頻線需要接在獨立顯卡上,重新開機,持續按F1,或者顯示器出來lenovo的logo的時候按F1,這樣就進到bios里了。聯*想*坑,戴爾貴。靠。

【源碼級開發】Qwen3接入MCP,企業級智能體開發實戰!

Qwen3接入MCP智能體開發實戰(上) 一、MCP技術與Qwen3原生MCP能力介紹 1.智能體開發核心技術—MCP 1.1 Function calling技術回顧 如何快速開發一款智能體應用,最關鍵的技術難點就在于如何讓大模型高效穩定的接入一些外部工具。而在MCP技術…

Linux下載與安裝

一、YUM 1.1 什么是YUM 在CentOS系統中,軟件管理方式通常有三種方式:rpm安裝、yum安裝以及編譯(源碼)安裝。 編譯安裝,從過程上來講比較麻煩,包需要用戶自行下載,下載的是源碼包,需…

PostgreSQL中的全頁寫

一、概述 在PGSQL數據庫中,默認的頁面大小為8KB,但是磁盤buffer的大小為4KB,扇區大小為512B。這就導致在操作系統的角度看數據庫的寫操作,其實并不是一種原子操作。如果操作系統發生了系統級別的故障,此時正好操作系統…