解放計算力:使用並行處理提升python for迴圈速度

来源:https://www.cnblogs.com/shiqianlong/archive/2023/06/23/17499349.html
-Advertisement-
Play Games

> Python 是一門功能強大的編程語言,但在處理大規模數據或複雜計算任務時,性能可能成為一個瓶頸。幸運的是,Python 提供了多種方法來提升性能,其中之一是利用並行處理來加速迴圈操作。本文將介紹如何使用並行處理技術來優化 for 迴圈,從而提高 Python 程式的執行速度。我們將討論並行處理 ...


Python 是一門功能強大的編程語言,但在處理大規模數據或複雜計算任務時,性能可能成為一個瓶頸。幸運的是,Python 提供了多種方法來提升性能,其中之一是利用並行處理來加速迴圈操作。本文將介紹如何使用並行處理技術來優化 for 迴圈,從而提高 Python 程式的執行速度。我們將討論並行處理的概念、常用的並行處理庫以及示例代碼來演示如何應用並行處理來加速 for 迴圈。

一、什麼是並行處理

在電腦科學中,"並行處理" 是指同時執行多個任務或操作的技術。它利用多個處理單元或線程來併發執行任務,從而提高程式的執行速度。在 Python 中,我們可以利用多線程、多進程或非同步編程等技術來實現並行處理。

二、常用的並行處理庫

Python 提供了多個並行處理庫,其中一些常用的庫包括:

  1. multiprocessing:這個內置庫提供了跨平臺的多進程支持,可以使用多個進程並行執行任務。
  2. threading:這個內置庫提供了多線程支持,可以在同一進程內使用多個線程並行執行任務。
  3. concurrent.futures:這個標準庫提供了高級的並行處理介面,可以使用線程池或進程池來管理併發任務的執行。
  4. joblib:這是一個流行的第三方庫,提供了簡單的介面來並行執行 for 迴圈,尤其適用於科學計算和機器學習任務。
  5. dask:這是一個靈活的第三方庫,提供了並行處理和分散式計算的功能,適用於處理大規模數據集。

在本文中,我們將重點關註 multiprocessing 和 joblib 這兩個庫來進行示範。

三、並行處理 for 迴圈的示例代碼

為了演示如何使用並行處理技術來加速 for 迴圈,我們將採用一個簡單的示例場景:計算一個列表中每個元素的平方值,並將結果存儲在新的列表中。

使用 multiprocessing 進行並行處理

import time
import multiprocessing

def square(num):
    time.sleep(1)  # 模擬耗時的計算操作
    return num ** 2

if __name__ == '__main__':
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    # 普通的 for 迴圈
    start_time = time.time()
    results = []
    for num in numbers:
        results.append(square(num))
    end_time = time.time()
    print("普通的 for 迴圈時間:", end_time - start_time)

    # 並行處理
    start_time = time.time()
    pool = multiprocessing.Pool()
    results = pool.map(square, numbers)
    pool.close()
    pool.join()
    end_time = time.time()
    print("並行處理時間:", end_time - start_time)

在上述代碼中,我們定義了一個 square 函數,用於計算給定數字的平方。然後,我們創建了一個 multiprocessing.Pool 對象,它管理了一個進程池。通過調用 pool.map 方法,我們將 square 函數應用到 numbers 列表的每個元素上,並使用多個進程並行執行。最後,我們獲得了計算結果並列印輸出。
輸出效果:
image-20230623164924383

使用 joblib 進行並行處理

import time
from joblib import Parallel, delayed

def square(num):
    time.sleep(1)  # 模擬耗時的計算操作
    return num ** 2

if __name__ == '__main__':
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    start_time = time.time()
    # 並行計算每個數字的平方
    results = Parallel(n_jobs=-1)(delayed(square)(num) for num in numbers)
    end_time = time.time()

    # 列印計算結果
    print(results)
    print("並行處理時間:", end_time - start_time)


在上述代碼中,我們使用了 joblib 庫的 Parallel 函數和 delayed 裝飾器。通過將 square 函數應用到 numbers 列表的每個元素上,我們可以使用多個線程或進程來並行執行計算。n_jobs=-1 表示使用所有可用的處理器內核。
輸出效果:
image-20230623164939044

四、總結

本文介紹瞭如何利用並行處理技術來優化 Python 中的 for 迴圈,從而提高程式的執行速度。我們討論了並行處理的概念,介紹了常用的並行處理庫,以及展示了使用 multiprocessing 和 joblib 庫進行並行處理的示例代碼。通過並行處理,我們可以充分利用多核處理器和多線程/進程的優勢,加速程式的運行並提升效率。然而,在使用並行處理時,需要註意避免共用資源的競爭和處理器負載的平衡,以免引入額外的複雜性。因此,在實際應用中,需要根據具體情況選擇合適的並行處理方案。希望本文能夠幫助你理解並行處理的概念和應用,併在需要優化 Python 程式性能時提供有益的指導。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • kkfileview是一個開源的文件文檔線上預覽項目解決方案。該項目使用流行的spring boot搭建,易上手和部署以及二次開發,並提供Docker鏡像發行包,方便在容器環境部署。基本支持主流辦公文檔的線上預覽。支持word excel ppt,pdf等辦公文檔支持txt,java,php,py,... ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第23面: > 面試官:`vector`瞭解嗎? > > 二師兄:嗯,用過。 > > 面試官:那你知道`vector`底層是如何實現的嗎? > > 二師兄:`vector`底層使用動態數組來存儲元素對象,同時使用`size`和`capacity`記錄 ...
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[celery筆記六之worker介紹](https://mp.weixin.qq.com/s/Ck_7cEz6dldN12OmYzFg9Q) 前面我們介紹過 celery 的理想的設計方式是幾個 worker 處理特定的任務隊列的數據,這樣可以 ...
  • ## 前言 多級指針在C語言中是一種特殊的指針類型,它可以指向其他指針的指針。 通過多級指針,我們可以間接地訪問或修改存儲在記憶體中的數據。 在本文中,我們將討論多級指針的概念、使用方法、使用場景以及常見錯誤及其避免方法。 ## 一、人物簡介 - 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— ...
  • [TOC](【後端面經-Spring】Spring 中 bean 的生命周期) ## 1.bean簡介 - bean是一個對象,是由Spring中的IoC創建、實例化的對象。 - 一般的java對象,使用的時候創建,不需要就釋放記憶體進行銷毀,而bean的生命周期更加複雜 - 作用域 - `singl ...
  • # wordCount ```Scala package com.doit.day03 import scala.io.{BufferedSource, Source} object WordCountDemo { def main(args: Array[String]): Unit = { // ...
  • 歡迎來到本篇文章,鴿了好久了,今天繼續寫下 Spring 的內容:Spring 中 Bean 的基本概念、基本寫法和 3 種實例化 Bean 的方式等。 ...
  • 在網上找了好幾個方法, 最後還是出現各種問題,解決不了播放GIF的功能。 最後,通過ChatGPT給出了簡單明瞭的方案(使用第三方庫imageio和matplotlib.animation來實現),調試直接通過。 但有小瑕疵,就是顯示gif時隱藏掉坐標軸的功能無效,於是再做了一下優化。 [最終代碼] ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...