Sebagai pembangun Python, kami sering menumpukan pada memastikan kod kami berfungsi sebelum kami bimbang tentang mengoptimumkannya. Walau bagaimanapun, apabila berurusan dengan aplikasi berskala besar atau kod kritikal prestasi, pengoptimuman menjadi penting. Dalam siaran ini, kami akan merangkumi dua alatan berkuasa yang boleh anda gunakan untuk mengoptimumkan kod Python anda: modul cProfile dan penterjemah PyPy.
Menjelang akhir siaran ini, anda akan belajar:
Python terkenal dengan kemudahan penggunaan, kebolehbacaan dan ekosistem perpustakaan yang luas. Tetapi ia juga lebih perlahan daripada beberapa bahasa lain seperti C atau Java kerana sifatnya yang ditafsirkan. Oleh itu, mengetahui cara mengoptimumkan kod Python anda boleh menjadi penting dalam aplikasi sensitif prestasi, seperti model pembelajaran mesin, sistem masa nyata atau sistem perdagangan frekuensi tinggi.
Pengoptimuman biasanya mengikut langkah berikut:
Sekarang, mari mulakan dengan memprofilkan kod anda.
cProfile ialah modul Python terbina dalam untuk pemprofilan prestasi. Ia menjejaki tempoh setiap fungsi dalam kod anda diambil untuk dilaksanakan, yang boleh membantu anda mengenal pasti fungsi atau bahagian kod yang menyebabkan kelembapan.
Cara paling mudah untuk memprofilkan skrip ialah dengan menjalankan cProfile dari baris arahan. Sebagai contoh, katakan anda mempunyai skrip bernama my_script.py:
python -m cProfile -s cumulative my_script.py
Penjelasan:
Ini akan menghasilkan pecahan terperinci tentang tempat kod anda menghabiskan masanya.
Mari kita lihat skrip Python asas yang mengira nombor Fibonacci secara rekursif:
def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": print(fibonacci(30))
Menjalankan skrip ini dengan cProfile:
python -m cProfile -s cumulative fibonacci_script.py
Sebaik sahaja anda menjalankan cProfile, anda akan melihat sesuatu seperti ini:
ncalls tottime percall cumtime percall filename:lineno(function) 8320 0.050 0.000 0.124 0.000 fibonacci_script.py:3(fibonacci)
Setiap lajur menyediakan data prestasi utama:
Jika fungsi fibonacci anda mengambil masa terlalu lama, output ini akan menunjukkan kepada anda tempat untuk menumpukan usaha pengoptimuman anda.
Anda juga boleh menggunakan cProfile secara pengaturcaraan dalam kod anda jika anda hanya mahu memprofil bahagian tertentu.
import cProfile def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": cProfile.run('fibonacci(30)')
Setelah anda mengenal pasti kesesakan dalam kod anda menggunakan cProfile, tiba masanya untuk mengoptimumkan.
Contoh:
# Before: Custom sum loop total = 0 for i in range(1000000): total += i # After: Using built-in sum total = sum(range(1000000))
Contoh:
# Before: Unnecessary repeated calculations for i in range(1000): print(len(my_list)) # len() is called 1000 times # After: Compute once and reuse list_len = len(my_list) for i in range(1000): print(list_len)
Contoh:
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2)
Ini sangat mempercepatkan pengiraan Fibonacci dengan menyimpan keputusan setiap panggilan rekursif.
PyPy ialah penterjemah Python alternatif yang menggunakan kompilasi Just-in-Time (JIT) untuk mempercepatkan kod Python anda. PyPy menyusun laluan kod yang kerap dilaksanakan ke dalam kod mesin, menjadikannya lebih pantas daripada penterjemah CPython standard untuk tugasan tertentu.
You can install PyPy using a package manager like apt on Linux or brew on macOS:
# On Ubuntu sudo apt-get install pypy3 # On macOS (using Homebrew) brew install pypy3
Once PyPy is installed, you can run your script with it instead of CPython:
pypy3 my_script.py
Now, let’s combine these tools to fully optimize your Python code.
Let’s revisit our Fibonacci example and put everything together.
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": import cProfile cProfile.run('print(fibonacci(30))')
After optimizing the code with memoization, run it using PyPy for further performance improvements:
pypy3 fibonacci_script.py
By leveraging cProfile and PyPy, you can greatly optimize your Python code. Use cProfile to identify and address performance bottlenecks in your code. Then, use PyPy to further boost your program’s execution speed through JIT compilation.
In summary:
With this approach, you can make your Python programs run faster and more efficiently, especially for CPU-bound tasks.
Connect with me:
Github
Linkedin
Atas ialah kandungan terperinci Mengoptimumkan Kod Python Menggunakan modul cProfile dan PyPy: Panduan Lengkap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!