首頁  >  文章  >  後端開發  >  Python程式優化技術。

Python程式優化技術。

WBOY
WBOY原創
2024-08-19 16:45:031133瀏覽

Python programming optimisation techniques.

最佳化程式碼至關重要,因為它直接影響軟體的效率、效能和可擴展性。編寫良好的程式碼運行速度更快,消耗的資源更少,並且更易於維護,使其更適合處理更大的工作負載並改善用戶體驗。它還降低了營運成本,因為高效的程式碼需要更少的處理能力和內存,這在資源有限的環境中尤其重要,例如嵌入式系統或大規模雲端應用程式。

另一方面,編寫不好的程式碼可能會導致執行時間變慢、能源消耗增加以及基礎設施成本更高。例如,在 Web 應用程式中,低效的程式碼可能會減慢頁面載入速度,導致使用者體驗不佳,並可能導致使用者流失。在資料處理任務中,低效的演算法會顯著增加處理大型資料集所需的時間,從而延遲關鍵的見解和決策。

此外,最佳化的程式碼通常更容易維護和擴充。透過遵循優化最佳實踐,開發人員可以確保其程式碼庫保持乾淨和模組化,從而更輕鬆地根據需要更新或擴展應用程式。隨著軟體專案複雜性的增加以及對系統的需求的增加,這一點變得越來越重要。

讓我們探索 10 種 Python 程式最佳化技術,它們可以幫助您編寫更有效率、效能更高的程式碼。這些技術對於開發滿足效能要求同時保持可擴展性和可維護性的強大應用程式至關重要。透過遵循最佳實踐,這些技術也可以應用於其他程式語言。

1. 可變包裝

變數打包透過將多個資料項分組到單一結構中來最大限度地減少記憶體使用。在記憶體存取時間顯著影響效能的場景(例如大規模資料處理)中,此技術至關重要。當相關資料打包在一起時,可以更有效地使用 CPU 緩存,從而加快資料檢索速度。

範例:

import struct

# Packing two integers into a binary format
packed_data = struct.pack('ii', 10, 20)

# Unpacking the packed binary data
a, b = struct.unpack('ii', packed_data)

在這個範例中,使用 struct 模組將整數打包成緊湊的二進位格式,使資料處理更有效率。

2. 儲存與記憶體

理解儲存(磁碟)和記憶體(RAM)之間的區別至關重要。記憶體操作速度更快,但易失性,而儲存是持久的,但速度較慢。在效能關鍵型應用程式中,將頻繁存取的資料保留在記憶體中並最大限度地減少儲存 I/O 對於速度至關重要。

範例:

import mmap

# Memory-mapping a file
with open("data.txt", "r+b") as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)
    print(mmapped_file.readline())
    mmapped_file.close()

內存映射檔案可讓您將磁碟儲存視為內存,從而加快大檔案的存取時間。

3. 固定長度變數與可變長度變數

固定長度變數儲存在連續的記憶體區塊中,使存取和操作更快。另一方面,可變長度變數需要額外的開銷來管理動態記憶體分配,這可能會減慢操作速度,特別是在即時系統中。

範例:

import array

# Using fixed-length array for performance
fixed_array = array.array('i', [1, 2, 3, 4, 5])

# Dynamic list (variable-length)
dynamic_list = [1, 2, 3, 4, 5]

這裡,array.array 提供了一個固定長度的數組,提供比動態清單更可預測的效能。

4. 內部與公共職能

內部函數是那些僅在定義它們的模組內使用的函數,通常針對速度和效率進行最佳化。公共函數公開供外部使用,並且可能包括額外的錯誤處理或日誌記錄,這使得它們的效率稍低。

範例:

def _private_function(data):
    # Optimized for internal use, with minimal error handling
    return data ** 2

def public_function(data):
    # Includes additional checks for external use
    if isinstance(data, int):
        return _private_function(data)
    raise ValueError("Input must be an integer")

透過將大量運算保留在私人函數中,您可以最佳化程式碼的效率,保留公用函數以實現外部安全性和可用性。

5. 功能修飾符

在Python中,裝飾器充當函數修飾符,讓您在函數主執行之前或之後添加功能。這對於快取、存取控製或日誌記錄等任務很有用,可以優化多個函數呼叫的資源使用。

範例:

from functools import lru_cache

@lru_cache(maxsize=100)
def compute_heavy_function(x):
    # A computationally expensive operation
    return x ** x

使用 lru_cache 作為裝飾器快取昂貴的函數呼叫的結果,透過避免冗餘計算來提高效能。

6. 使用圖書館

利用庫可以讓您避免重新發明輪子。像 NumPy 這樣的函式庫是用 C 語言編寫的,並且是為了效能而建構的,與純 Python 實作相比,它們對於繁重的數值計算來說更有效率。

範例:

import numpy as np

# Efficient matrix multiplication using NumPy
matrix_a = np.random.rand(1000, 1000)
matrix_b = np.random.rand(1000, 1000)
result = np.dot(matrix_a, matrix_b)

Here, NumPy's dot function is enhanced for matrix operations, far outperforming nested loops in pure Python.

7. Short-Circuiting Conditionals

Short-circuiting reduces unnecessary evaluations, which is particularly valuable in complex condition checks or when involving resource-intensive operations. It prevents execution of conditions that don't need to be checked, saving both time and computational power.
Since conditional checks will stop the second they find the first value which satisfies the condition, you should put the variables most likely to validate/invalidate the condition first. In OR conditions (or), try to put the variable with the highest likelihood of being true first, and in AND conditions (and), try to put the variable with the highest likelihood of being false first. As soon as that variable is checked, the conditional can exit without needing to check the other values.

Example:

def complex_condition(x, y):
    return x != 0 and y / x > 2  # Stops evaluation if x is 0

In this example, Python’s logical operators ensure that the division is only executed if x is non-zero, preventing potential runtime errors and unnecessary computation.

8. Free Up Memory

In long-running applications, especially those dealing with large datasets, it’s essential to free up memory once it’s no longer needed. This can be done using del, gc.collect(), or by allowing objects to go out of scope.

Example:

import gc

# Manual garbage collection to free up memory
large_data = [i for i in range(1000000)]
del large_data
gc.collect()  # Forces garbage collection

Using gc.collect() ensures that memory is reclaimed promptly, which is critical in memory-constrained environments.

9. Short Error Messages

In systems where memory or bandwidth is limited, such as embedded systems or logging in distributed applications, short error messages can reduce overhead. This practice also applies to scenarios where large-scale error logging is necessary.

Example:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Err: Div/0")  # Short, concise error message

Short error messages are useful in environments where resource efficiency is crucial, such as IoT devices or high-frequency trading systems.

10. Optimize Loops

Loops are a common source of inefficiency, especially when processing large datasets. Optimising loops by reducing iterations, simplifying the logic, or using vectorised operations can significantly improve performance.

Example:

import numpy as np

# Vectorised operation with NumPy
array = np.array([1, 2, 3, 4, 5])

# Instead of looping through elements
result = array * 2  # Efficient, vectorised operation

Vectorisation eliminates the need for explicit loops, leveraging low-level optimisations for faster execution.


By applying these techniques, you can ensure your Python or other programming language programs run faster, use less memory, and are more scalable, which is especially important for applications in data science, web and systems programming.

PS: you can use https://perfpy.com/#/ to check python code efficiency.

以上是Python程式優化技術。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn