Cursor 教我學 Python

文章目錄

    • 1. 寫在最前面
    • 2. Python 語法
      • 2.1 yield
        • 2.1.1 yield 和 return 的區別
        • 2.1.2 golang 中實現 yield 語法
    • 3. aiohttp 庫
      • 3.1 原始寫法
      • 3.2 修改寫法
      • 3.2 耗時對比分析
    • 4. 碎碎念
    • 5. 參考資料

1. 寫在最前面

最近加了很多 Python Coding 的任務,雖然在 AI 加持下能夠順利完成,但是還是覺得心理不踏實,覺得很多代碼 AI 寫完自己不是很懂,不喜歡這種感覺。

剛好周日上午沒事,抽空記錄在 Python 開發中遇到的神奇語法和庫。

2. Python 語法

2.1 yield

修改的代碼中,函數的返回很多處用了 Yield 而不是 return ,這引起了我的好奇。

2.1.1 yield 和 return 的區別

在 Python 中,yieldreturn 都用于從函數中返回值,但它們之間有一些重要的區別:

  • 返回類型

    • return:

      • return 語句用于結束函數的執行,并將一個值返回給調用者。函數在執行到 return 時會立即退出。

      • 每次調用函數時,都是從頭開始執行,直到遇到 return

    • yield:

      • yield 語句用于定義生成器函數。生成器函數在執行時不會立即返回值,而是返回一個生成器對象。

      • 當生成器函數被調用時,它不會立即執行,而是返回一個生成器對象。可以通過迭代這個生成器對象來逐步執行函數的代碼,每次遇到 yield 時返回一個值,并在下一次迭代時從上次停止的地方繼續執行。

  • 內存使用

    • return:

      • 返回一個完整的結果(例如一個列表),可能會占用較多內存,特別是當結果很大時。
    • yield:

      • 生成器按需生成值,通常會更節省內存,特別是在處理大型數據集時,因為它不會一次性生成所有結果。
  • yield 的使用場景:

    • 內存效率:適合處理大數據集,避免一次性加載。

    • 無限序列:可生成無限序列,按需計算。

    • 狀態保持:在函數中保持狀態,適合需要維護狀態的場景。

    • 協程:在異步編程中用于協作式多任務。

    • 管道處理:構建數據處理管道,方便數據流動。

  • 示例

    • 使用 return 的函數:

      def get_squares(n):return [x*x for x in range(n)]squares = get_squares(5)
      print(squares)  # 輸出: [0, 1, 4, 9, 16]
      
    • 使用 yield 的生成器:

      def get_squares(n):for x in range(n):yield x*xsquares_gen = get_squares(5)
      for square in squares_gen:print(square)  # 輸出: 0, 1, 4, 9, 16
      
2.1.2 golang 中實現 yield 語法

之前寫的是 golang ,為了用類比法更好的理解 yield ,可以在 golang 中實現一個類似能力的示例。

package mainimport ("fmt"
)// 生成器函數,返回一個通道
func getSquares(n int) <-chan int {ch := make(chan int) // 創建一個通道go func() {for x := 0; x < n; x++ {ch <- x * x // 將計算結果發送到通道}close(ch) // 關閉通道,表示沒有更多值}()return ch // 返回通道
}func main() {squares := getSquares(5) // 獲取生成器通道for square := range squares { // 迭代通道中的值fmt.Println(square) // 輸出: 0, 1, 4, 9, 16}
}

函數說明:

  • 通道:在 getSquares 函數中,我們創建了一個通道 ch,用于發送計算結果。

  • goroutine:我們使用 go 關鍵字啟動了一個 goroutine,在這個 goroutine 中計算平方并將結果發送到通道。

  • 關閉通道:當所有值都發送完后,我們關閉通道,以便接收方知道沒有更多值可供接收。

  • 迭代通道:在 main 函數中,我們使用 range 迭代通道,從中接收值。

3. aiohttp 庫

需求是需要在客戶請求大模型前,提前發送一次請求大模型,確保在客戶請求的時候,就可以節省掉 tls 握手和 tcp 建立連接的時間,簡稱之為預熱。

3.1 原始寫法

async def analyze_backend_consistency(num_requests: int = 5, delay: float = 0.5, concurrent: bool = False):# 順序發送請求results = []for i in range(num_requests):try:connector = aiohttp.TCPConnector(ssl=True)async with aiohttp.ClientSession(connector=connector) as session:result = await make_request(session, i + 1)results.append(result)if i < num_requests - 1:await asyncio.sleep(delay)except Exception as e:print(f"請求 {i + 1} 失敗: {str(e)}")# 打印每個請求的結果for result in results:print(f"\n請求 {result['request_id']} 結果:")print(f"遠程IP:端口 = {result['remote_ip']}:{result['remote_port']}")print(f"請求ID = {result['x_request_id']}")print(f"處理時間 = {result['upstream_time']}ms")print(f"總響應時間 = {result['response_time']}ms")print("-" * 50)# 分析結果print("\n分析結果:")unique_ips = set(r['remote_ip'] for r in results)print(f"使用的不同IP數量: {len(unique_ips)}")print(f"IP列表: {', '.join(str(ip) for ip in unique_ips)}")# 計算平均響應時間avg_response_time = sum(float(r['response_time']) for r in results) / len(results)print(f"平均響應時間: {avg_response_time:.2f}ms")# 檢查是否所有請求都使用了同一個連接print(f"所有請求是否使用同一個連接: {len(unique_ips) == 1}")# 分析處理時間upstream_times = [float(r['upstream_time']) for r in results]print(f"后端處理時間范圍: {min(upstream_times):.2f}ms - {max(upstream_times):.2f}ms")print(f"后端處理時間平均值: {sum(upstream_times)/len(upstream_times):.2f}ms")

測試結果:

在這里插入圖片描述

3.2 修改寫法

async def analyze_backend_consistency(num_requests: int = 5, delay: float = 0.5, concurrent: bool = False):connector = aiohttp.TCPConnector(ssl=True)async with aiohttp.ClientSession(connector=connector) as session:results = []if concurrent:# 并發發送所有請求tasks = [make_request(session, i + 1) for i in range(num_requests)]results = await asyncio.gather(*tasks)else:# 順序發送請求for i in range(num_requests):try:result = await make_request(session, i + 1)results.append(result)if i < num_requests - 1:await asyncio.sleep(delay)except Exception as e:print(f"請求 {i + 1} 失敗: {str(e)}")# 打印每個請求的結果for result in results:print(f"\n請求 {result['request_id']} 結果:")print(f"遠程IP:端口 = {result['remote_ip']}:{result['remote_port']}")print(f"請求ID = {result['x_request_id']}")print(f"處理時間 = {result['upstream_time']}ms")print(f"總響應時間 = {result['response_time']}ms")print("-" * 50)# 分析結果print("\n分析結果:")unique_ips = set(r['remote_ip'] for r in results)print(f"使用的不同IP數量: {len(unique_ips)}")print(f"IP列表: {', '.join(str(ip) for ip in unique_ips)}")# 計算平均響應時間avg_response_time = sum(float(r['response_time']) for r in results) / len(results)print(f"平均響應時間: {avg_response_time:.2f}ms")# 檢查是否所有請求都使用了同一個連接print(f"所有請求是否使用同一個連接: {len(unique_ips) == 1}")# 分析處理時間upstream_times = [float(r['upstream_time']) for r in results]print(f"后端處理時間范圍: {min(upstream_times):.2f}ms - {max(upstream_times):.2f}ms")print(f"后端處理時間平均值: {sum(upstream_times)/len(upstream_times):.2f}ms")

測試結果:
在這里插入圖片描述

3.2 耗時對比分析

原始寫法修改寫法
特點每個請求都創建新的 TCPConnector 和 ClientSession
每次請求都要重新建立 TCP 連接和 TLS 握手
不復用 HTTP/2 連接
每個請求的耗時 = TCP建立(~40ms) + TLS握手(~200ms) + 請求處理時間
只創建一次 TCPConnector 和 ClientSession
TCP 連接和 TLS 握手只進行一次
復用 HTTP/2 連接
第一個請求耗時 = TCP建立 + TLS握手 + 請求處理時間
后續請求耗時 = 請求處理時間

4. 碎碎念

周日的時候寫了 80%,今晚剛好手里的活搞的差不多了,給總結收個尾。上海最近的暴雨和雷聲有點子嚇人:

  • 世間最重要的事莫過于懂得讓自己屬于自己。

  • 偶爾覺得媽媽很丟人,媽媽為什么連起碼的臉面的自尊都沒有呢?我都覺得上火。比起她自己,她有更想守護的,那就是我。人真正變強大,不是因為守護著自尊心,而是拋開自尊心的時候。所以媽媽很強大。

這周就要回去看媽媽啦,開心,就寫到這里吧。

5. 參考資料

  • 如何理解Python中的yield用法?
  • https://docs.aiohttp.org/en/stable/tracing_reference.html#aiohttp-client-tracing-reference

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

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

相關文章

Ollama:本地大語言模型部署和使用詳解

1.什么是Ollama&#xff1f; Ollama是一個開源的大語言模型管理工具&#xff0c;具有以下特點&#xff1a; 簡單易用&#xff1a;提供簡單的命令行接口本地部署&#xff1a;模型運行在本地&#xff0c;保護數據隱私跨平臺支持&#xff1a;支持Windows、macOS、Linux豐富的模型…

云計算學習100天-第41天 -普羅米修斯2

目錄 五、添加被監控端 1、在web1[192.168.88.100]上部署node exporter 2、在Prometheus服務器上添加監控節點 3、瀏覽器查看添加結果 六、Grafana的部署 概述 部署步驟 七、監控MySQL數據庫 1、配置MySQL 2、配置mysql exporter 3、配置prometheus監控mysql 五、添…

集成電路學習:什么是SVM支持向量機

SVM:支持向量機 SVM,即支持向量機(Support Vector Machine),是一種常用的機器學習算法,特別適用于分類和回歸問題。以下是對SVM的詳細解析: 一、SVM的基本原理 SVM的基本思想是在特征空間中尋找一個最優的超平面,使得不同類別的樣本能夠被最大化地分開。這個最優…

盲盒抽谷機小程序開發:如何用3D技術重構沉浸式體驗?

在盲盒經濟中&#xff0c;“沉浸感”是提升用戶停留時長與轉化率的核心武器。某品牌通過3D扭蛋機旋轉、卡牌翻轉特效&#xff0c;使用戶停留時長從15秒延長至45秒&#xff0c;轉化率提升25%&#xff1b;另一品牌上線AR試戴功能后&#xff0c;單次抽谷時長延長至2分鐘&#xff0…

集采與反腐雙重壓力下,醫藥銷售的破局之道:從資源依賴到價值重構

在醫藥行業進入集采常態化與反腐縱深推進的新階段&#xff0c;“資源匱乏”“拜訪受阻” 成為縈繞在眾多醫藥銷售人員心頭的難題。當傳統的資金投入、學術活動等資源型打法逐漸失效&#xff0c;行業正面臨一場從 “資源驅動” 到 “價值驅動” 的深刻變革。那些曾在市場中創造過…

Elasticsearch常用命令(未完)

網上針對es常用命令好多都是寫的感覺非常復雜難以理解&#xff0c;所以我還是自己整理了一下相關的常用命令。 對es輸入指令可以用很多種方法比如用es的谷歌瀏覽器插件&#xff0c;亦或者postman&#xff0c;我個人比較喜歡用postman比較簡單直接 1.刪除指定索引下的所有數據…

【系統架構設計(七)】 需求工程之:面向對象需求分析方法:統一建模語言(UML)(下)

文章目錄一、用例圖1. 用例模型建立的系統化流程第一步&#xff1a;識別參與者第二步&#xff1a;合并需求獲得用例第三步&#xff1a;細化用例描述第四步&#xff1a;調整用例模型&#xff08;可選步驟&#xff09;2. 用例之間的關系類型二、類圖與對象圖概念類之間的關系三、…

數據結構——樹(04二叉樹,二叉搜索樹專項,代碼練習)

文章目錄一、概念二、構造1.1先序序列 構造BST1.2中序序列 轉換為BST1.3中序序列鏈表轉換為BST1.4BST轉換為中序序列鏈表1.7BST的序列化和反序列化1.6BST的種數二、BST的增刪改查2.1驗證是否為BST2.2查找值為val的節點2.3插入一個值為val的節點2.4刪除一個值為val的節點2.5恢復…

ArkUI核心功能組件使用

1.Tabs&#xff08;選項卡&#xff09; 1.1 概述 Tabs組件的頁面組成包含兩個部分&#xff0c;分別是TabContent和TabBar。TabContent是內容頁&#xff0c;TabBar是導航頁簽欄。 TabBar是導航頁簽欄&#xff0c;頁面結構如下圖所示&#xff0c;根據不同的導航類型&#xff0c;布…

Qt5 多媒體大綱

一、入門準備 基礎知識 熟悉 Qt 的信號槽機制、事件循環 掌握 .pro 工程文件配置&#xff08;QT multimedia multimediawidgets&#xff09; 熟悉常見的音視頻格式與編解碼器基礎 環境配置 Qt Creator Qt 5.x 確認安裝了 multimedia 模塊與 mediaservice 插件 熟悉調試…

音頻數據集采樣率選擇建議

你好&#xff01;這是一個非常棒且非常重要的問題&#xff0c;在音頻機器學習項目中&#xff0c;選擇合適的采樣率是平衡計算效率和模型性能的關鍵。 直接回答你的問題&#xff1a;將音頻下采樣到 800 Hz 對于絕大多數音頻分類任務來說都太低了&#xff0c;幾乎肯定會丟失大量關…

深度學習系列 | Seq2Seq端到端翻譯模型

一、通俗總結Seq2Seq 就像一個 “序列轉換器”&#xff1a;先把輸入的一段話 “壓縮成一個核心意思”&#xff0c;再根據這個意思 “一句句生成另一段話”&#xff0c;能搞定翻譯、聽寫這類 “輸入輸出不一樣長” 的任務&#xff0c;但太長的內容可能記不全&#xff0c;還容易越…

Spring MVC BOOT 中體現的設計模式

Spring:創建型:單例模式:Bean默認就是單例的&#xff0c;是餓漢模式的&#xff0c;但是可以通過Lazy設置為懶漢工廠模式&#xff1a;可自定義FactroyBean&#xff0c;實現Bean自己的生產工廠結構型:代理模式&#xff1a;AOP就是典型的動態代理&#xff0c;有jdk和cglib兩種實現…

Chrome瀏覽器調用ActiveX控件之allWebOffice在線編輯控件

背景 allWebOffice控件能夠實現在瀏覽器窗口中在線操作文檔的應用&#xff08;閱讀、編輯、保存等&#xff09;&#xff0c;支持編輯文檔時保留修改痕跡&#xff0c;支持書簽位置內容動態填充&#xff0c;支持公文套紅&#xff0c;支持文檔保護控制等諸多辦公功能&#xff0c;本…

嵌入式 - 硬件:51單片機

本節重點1. MCU、CPU、GPU、NPU、SOC、MPU、FPU2. 內存、外存的區別3. RAM和ROM的區別&#xff0c;單片機RAM大小4. 三大總線及其特點5. 發光二極管分類及其特點6. 數碼管顯示原理一、嵌入式以應用為中心&#xff0c;以計算機技術為基礎&#xff0c;軟硬件可裁剪的專用計算機系…

Java Spring Boot 中 Redis 緩存穿透問題排查與解決方案

前言 作為一名普通的 Java 程序開發者&#xff0c;日常開發中難免會遇到一些看似簡單但實際排查起來非常棘手的問題。在最近的一個項目中&#xff0c;我遇到了一個 Redis 緩存穿透的問題&#xff0c;導致系統在高并發下性能急劇下降&#xff0c;甚至出現服務響應超時的情況。這…

Ubuntu下配置并遠程連接MySQL

1、安裝mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、啟動并設置服務為開機自啟動systemctl enable mysql.service --now4、查看服務狀態systemct…

開源 C++ QT Widget 開發(九)圖表--儀表盤

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 C QT Widget 開發&#xff08;一&#xff09;工程文件結構-CSDN博客 開源…

怎么為服務器設置或重置服務器密碼?

創建服務器后&#xff0c;您可以設置服務器的登錄密碼&#xff0c;如果你忘記了密碼&#xff0c;可以重新設置實例的密碼。本文講一下如何重置阿里云服務器密碼。使用限制&#xff1a;離線重置密碼僅支持在控制臺設置或重置服務器管理員賬號的密碼。?Windows 實例的默認用戶名…

【線性代數入門 | 那忘算8】洛谷P3389 高斯消元(內附行列式教學)

想了想還是單開了一篇&#xff0c;數學王子值得&#xff01; 專欄指路&#xff1a;《再來一遍一定記住的算法&#xff08;那些你可能忘記了的算法&#xff09;》 前置知識&#xff1a; 矩陣&#xff1a;數的集合&#xff0c;一般是方程的系數。 題面&#xff1a; 洛谷P3389 …