使用 Python 進行高效能計算:加速程式碼執行


Python 的簡潔性和多功能性使其在開發者中獲得了極高的人氣。然而,Python 的解釋性特性會導致其程式碼執行速度比低階語言慢。為了克服這一限制並充分發揮 Python 在高效能計算方面的潛力,已經開發了許多技術和工具。本文深入探討了使用 Python 進行高效能計算的領域,特別強調了加速程式碼執行。

我們將深入探討平行計算,使用 multiprocessing、threading 等庫來分配工作負載並實現更快的執行。此外,我們將探索 NumPy 的強大功能,這是一個用於高效數學計算的庫,並探索使用 Numba 等工具進行即時 (JIT) 編譯,從而彌合解釋型語言和編譯型語言之間的差距。透過採用這些策略並瞭解可用的最佳化技術,開發者可以最大限度地提高 Python 程式碼的效能,並輕鬆處理計算密集型任務。

使用 Multiprocessing 模組

探索平行計算是增強 Python 效能的一種複雜方法。透過將工作負載分配到多個處理器或核心,可以實現顯著的速度提升。Python 提供了幾個支援平行計算的庫,包括 multiprocessing 和 threading。讓我們探索一個使用 multiprocessing 模組的簡單示例,以便更好地理解其功能和優勢 

示例

import multiprocessing

def square(number):
   return number ** 2

if __name__ == '__main__':
   numbers = [1, 2, 3, 4, 5]
   pool = multiprocessing.Pool()
   results = pool.map(square, numbers)
   print(results)

在這個示例中,我們定義了一個 square 函式,用於計算給定數字的平方。使用 multiprocessing.Pool() 類,我們建立了一個工作程序池,可以並行執行任務。map() 函式使用可用的工作程序將 square 函式應用於 numbers 列表中的每個元素。最後,我們列印結果,這些結果將是輸入數字的平方。透過將工作負載分配到多個程序,我們可以實現更快的程式碼執行。

使用 NumPy

NumPy 是 Python 中高效能計算的強大工具。這個強大的庫提供了對大型多維陣列和矩陣的全面支援,並附帶了大量針對這些陣列上的高效操作而定製的數學函式。在 C 中實現 NumPy 提供了一個介面,使我們能夠使用向量化操作執行復雜的計算,從而導致效能大幅提升。為了說明這一點,讓我們深入探討一個使用 NumPy 功能進行矩陣乘法的示例 

示例

import numpy as np

matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])

result = np.dot(matrix1, matrix2)
print(result)

輸出

[[19 22]
 [43 50]]

在此程式碼片段中,我們使用 NumPy 的 array() 函式建立了兩個矩陣。然後使用 np.dot() 函式來乘以矩陣,生成一個儲存在 result 變數中的新矩陣。

使用 JIT 編譯

除了平行計算和 NumPy 之外,加速 Python 程式碼執行的另一種技術是即時 (JIT) 編譯。JIT 編譯在執行時動態地編譯程式碼的部分內容,對其進行最佳化以適應特定的硬體架構。這種方法彌合瞭解釋型語言(如 Python)和編譯型語言(如 C 或 C++)之間的差距。一個實現 JIT 編譯的流行庫是 Numba。

示例

讓我們看一個示例 –

import numba

@numba.jit
def sum_numbers(n):
   total = 0
   for i in range(n):
      total += i
   return total

result = sum_numbers(1000000)
print(result)

在此程式碼片段中,sum_numbers() 函式使用迴圈從 0 迭代到 n,並在 total 變數中累積總和。透過包含 @numba.jit 裝飾器,Numba 應用 JIT 編譯,最佳化迴圈以提高效能。結果,與使用純 Python 相比,我們體驗到了更快的執行時間。Numba 的多功能性擴充套件到各種計算密集型任務,使其成為追求高效程式碼執行的寶貴工具。

使用斐波那契庫

此外,Python 提供了一些最佳化策略,可以進一步提高程式碼效能。一個值得注意的策略是記憶化,這是一種圍繞快取代價高昂的函式呼叫結果並在每次出現相同輸入時重用這些結果的技術。記憶化在處理遞迴或重複計算時特別有價值。透過儲存和檢索先前計算的結果,可以避免冗餘計算,從而顯著加速程式碼執行。

示例

這是一個示例 –

def fibonacci(n, cache={}):
   if n in cache:
      return cache[n]
   if n <= 1:
      result = n
   else:
      result = fibonacci(n - 1) + fibonacci(n - 2)
   cache[n] = result
   return result

result = fibonacci(10)
print(result)

輸出

55

在提供的程式碼中,我們定義了一個 Fibonacci 函式,該函式利用記憶化來有效地計算斐波那契數列。透過將先前計算的結果儲存在快取字典中,該函式透過檢查是否已計算出斐波那契數來避免冗餘計算,然後再執行計算。

使用 CVS

此外,最佳化輸入/輸出 (I/O) 操作在提高整體程式碼效能方面發揮著至關重要的作用。Python 提供了一系列專門用於高效 I/O 處理的模組,包括用於讀取和寫入 CSV 檔案的 csv、用於物件序列化的 pickle 和用於壓縮檔案操作的 gzip。透過選擇合適的 I/O 模組並實施緩衝讀取或寫入等技術,我們可以最大限度地減少磁碟訪問並顯著加速資料處理。

示例

這是一個示例程式碼 –

import csv

def read_csv_file(filename):
   data = []
   with open(filename, 'r') as file:
      reader = csv.reader(file)
      for row in reader:
         data.append(row)
   return data

result = read_csv_file('data.csv')
print(result)

在此示例中,我們定義了一個 read_csv_file 函式,該函式使用 csv.reader 類有效地讀取 CSV 檔案。with 語句確保了正確的檔案處理,並在讀取完成後自動關閉檔案。透過逐行讀取檔案,我們避免了將整個 CSV 一次載入到記憶體中,這對於大型資料集來說可能是有益的。

結論

總之,Python 提供了加速程式碼執行和高效能計算的技術和庫。使用 multiprocessing 進行平行計算可以分配工作負載,減少執行時間。NumPy 使得陣列操作更高效,從而加快數學計算速度。像 Numba 這樣的即時編譯庫可以提高執行速度。

透過使用這些工具,開發者可以釋放 Python 的全部潛力,處理要求苛刻的任務並最佳化程式碼效能。請記住分析應用程式的需求並相應地選擇合適的技術。透過深入瞭解這些方法,我們可以為當今的計算挑戰提供高效能解決方案。

更新於: 2023-07-26

210 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.