Rumah >pembangunan bahagian belakang >Tutorial Python >Teknik pengoptimuman pengaturcaraan Python.

Teknik pengoptimuman pengaturcaraan Python.

WBOY
WBOYasal
2024-08-19 16:45:031163semak imbas

Python programming optimisation techniques.

Kod yang dioptimumkan adalah penting kerana ia memberi kesan secara langsung kepada kecekapan, prestasi dan kebolehskalaan perisian. Kod yang ditulis dengan baik berjalan lebih pantas, menggunakan lebih sedikit sumber dan lebih boleh diselenggara, menjadikannya lebih sesuai untuk mengendalikan beban kerja yang lebih besar dan meningkatkan pengalaman pengguna. Ia juga mengurangkan kos operasi, kerana kod yang cekap memerlukan kuasa pemprosesan dan memori yang kurang, yang amat penting dalam persekitaran dengan sumber terhad, seperti sistem terbenam atau aplikasi awan berskala besar.

Kod bertulis yang buruk, sebaliknya, boleh menyebabkan masa pelaksanaan yang perlahan, penggunaan tenaga yang meningkat dan kos infrastruktur yang lebih tinggi. Sebagai contoh, dalam aplikasi web, kod yang tidak cekap boleh melambatkan pemuatan halaman, membawa kepada pengalaman pengguna yang buruk dan berpotensi menghalau pengguna. Dalam tugas pemprosesan data, algoritma yang tidak cekap boleh meningkatkan dengan ketara masa yang diperlukan untuk memproses set data yang besar, melambatkan cerapan dan keputusan kritikal.

Selain itu, kod yang dioptimumkan selalunya lebih mudah untuk dikekalkan dan dilanjutkan. Dengan mematuhi amalan terbaik pengoptimuman, pembangun boleh memastikan bahawa pangkalan kod mereka kekal bersih dan modular, menjadikannya lebih mudah untuk mengemas kini atau menskalakan aplikasi mengikut keperluan. Ini menjadi semakin penting apabila projek perisian berkembang dalam kerumitan dan apabila permintaan terhadap sistem meningkat.

Mari terokai 10 teknik pengoptimuman pengaturcaraan Python yang boleh membantu anda menulis kod yang lebih cekap dan berprestasi. Teknik ini adalah penting untuk membangunkan aplikasi teguh yang memenuhi keperluan prestasi sambil kekal berskala dan boleh diselenggara dari semasa ke semasa. Teknik ini juga boleh digunakan pada bahasa pengaturcaraan lain dengan mengikuti amalan terbaik.

1. Pembungkusan Boleh Ubah

Pembungkusan pembolehubah meminimumkan penggunaan memori dengan mengumpulkan berbilang item data ke dalam satu struktur. Teknik ini adalah kritikal dalam senario di mana masa capaian memori memberi kesan ketara kepada prestasi, seperti dalam pemprosesan data berskala besar. Apabila data berkaitan dibungkus bersama, ia membolehkan penggunaan cache CPU yang lebih cekap, yang membawa kepada perolehan data yang lebih pantas.

Contoh:

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)

Dalam contoh ini, menggunakan modul struct mengemas integer ke dalam format binari padat, menjadikan pemprosesan data lebih cekap.

2. Storan lwn. Memori

Memahami perbezaan antara storan (cakera) dan memori (RAM) adalah penting. Operasi memori lebih pantas tetapi tidak menentu, manakala storan berterusan tetapi lebih perlahan. Dalam aplikasi kritikal prestasi, menyimpan data yang kerap diakses dalam ingatan dan meminimumkan storan I/O adalah penting untuk kelajuan.

Contoh:

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()

Fail yang dipetakan memori membolehkan anda merawat storan cakera seolah-olah ia adalah memori, mempercepatkan masa akses untuk fail besar.

3. Pembolehubah Panjang Tetap lwn. Pembolehubah Panjang

Pembolehubah panjang tetap disimpan dalam blok memori bersebelahan, menjadikan akses dan manipulasi lebih pantas. Pembolehubah panjang pembolehubah, sebaliknya, memerlukan overhed tambahan untuk mengurus peruntukan memori dinamik, yang boleh melambatkan operasi, terutamanya dalam sistem masa nyata.

Contoh:

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]

Di sini, array.array menyediakan tatasusunan panjang tetap, menawarkan prestasi yang lebih boleh diramal daripada senarai dinamik.

4. Fungsi Dalaman lwn. Awam

Fungsi dalaman ialah fungsi yang bertujuan untuk digunakan hanya dalam modul yang ditakrifkan, selalunya dioptimumkan untuk kelajuan dan kecekapan. Fungsi awam terdedah untuk kegunaan luaran dan mungkin termasuk pengendalian ralat atau pengelogan tambahan, menjadikannya kurang cekap.

Contoh:

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")

Dengan mengekalkan pengiraan berat dalam fungsi peribadi, anda mengoptimumkan kecekapan kod, menempah fungsi awam untuk keselamatan luaran dan kebolehgunaan.

5. Pengubahsuai Fungsi

Dalam Python, penghias berfungsi sebagai pengubah suai fungsi, membolehkan anda menambah kefungsian sebelum atau selepas pelaksanaan utama fungsi. Ini berguna untuk tugasan seperti caching, kawalan akses atau pengelogan, yang boleh mengoptimumkan penggunaan sumber merentas berbilang panggilan fungsi.

Contoh:

from functools import lru_cache

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

Menggunakan lru_cache sebagai penghias menyimpan cache hasil panggilan fungsi yang mahal, meningkatkan prestasi dengan mengelakkan pengiraan berlebihan.

6. Gunakan Perpustakaan

Memanfaatkan perpustakaan membolehkan anda mengelak daripada mencipta semula roda. Perpustakaan seperti NumPy ditulis dalam C dan dibina untuk prestasi, menjadikannya jauh lebih cekap untuk pengiraan berangka yang berat berbanding dengan pelaksanaan Python tulen.

Contoh:

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.

Atas ialah kandungan terperinci Teknik pengoptimuman pengaturcaraan Python.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn