Mod Berulir Percuma dalam PythonGIL dilumpuhkan)

Mary-Kate Olsen
Lepaskan: 2024-10-11 10:17:02
asal
981 orang telah melayarinya

Python 3.13 baru sahaja dikeluarkan baru-baru ini, dengan ciri baharu yang menakjubkan dipanggil "Mod berulir percuma". Ini adalah peningkatan yang hebat untuk prestasi kod anda apabila anda menggunakan benang. Artikel ini menunjukkan cara untuk mendayakan ciri ini (tidak didayakan secara lalai) dan menunjukkan kesan "mod belir bebas" pada prestasi kod anda.

Pasang Python Berulir Percuma

Pengguna Windows & MacOS

Untuk pengguna Windows dan MacOS, cuma muat turun pemasang terbaharu daripada tapak web Python. Apabila anda memasang Python, terdapat kotak pilihan untuk mendayakan "Mod berulir percuma" apabila anda memilih pilihan "Sesuaikan pemasangan".

Free Threaded Mode in PythonGIL disabled)

pengguna Ubuntu

Untuk pengguna Ubuntu, anda boleh mendayakan ciri ini dengan menjalankan arahan berikut dalam terminal anda:

sudo add-apt-repository ppa:deadsnakes
sudo apt-get update
sudo apt-get install python3.13-nogil
Salin selepas log masuk

Sahkan Mod Berbenang Percuma didayakan

Selepas memasang pakej, anda boleh menjalankan kod anda dengan python3.13 (asal) dan python3.13-nogil atau python3.13t (python3.13t percuma).

Lihat artikel ini untuk mendapatkan butiran lanjut tentang cara memasang eksperimen Python 3.13 pada distro Linux.

Untuk mengesahkan Python anda telah mendayakan "Mod berulir percuma", anda boleh menggunakan arahan berikut:

python3.13t -VV
Python 3.13.0 experimental free-threading build (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Salin selepas log masuk

Prestasi Mod Berbenang Percuma

Persediaan Eksperimen

Mari kita lihat kesan mod berbenang percuma pada kod ringkas di bawah:

  • Saya mempunyai pekerja fungsi yang melakukan beberapa pengiraan dan mengembalikan jumlah nombor daripada 0 hingga 10 juta.
  • Saya mempunyai "Ujian 1" untuk menjalankan fungsi pekerja 5 kali, secara berurutan.
  • Saya mempunyai "Ujian 2" untuk menjalankan fungsi pekerja secara selari menggunakan berbilang utas, dengan bilangan utas ialah 5.
  • Saya memang mengukur masa pelaksanaan kedua-dua ujian.
import sys
import threading
import time

print("Python version : ", sys.version)

def worker():
    sum = 0
    for i in range(10000000):
        sum += i


n_worker = 5
# Single thread

start = time.perf_counter()
for i in range(n_worker):
    worker()
print("Single Thread: ", time.perf_counter() - start, "seconds")


# Multi thread
start = time.perf_counter()
threads = []
for i in range(n_worker):
    t = threading.Thread(target=worker)

    threads.append(t)
    t.start()

for t in threads:
    t.join()
print("Multi Thread: ", time.perf_counter() - start, "seconds")

Salin selepas log masuk

Kemudian, saya akan menjalankan kod ini dengan Python biasa (python3.13 binary) dan Python thread percuma (pypy3.13t binary).

Keputusan

Pertama, jalankan ujian dengan python3.13:

python3.13 gil_test.py 
Python version :  3.13.0 (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Single Thread:  1.4370562601834536 seconds
Multi Thread:  1.3681392602156848 seconds
Salin selepas log masuk

Kemudian, jalankan ujian dengan pypy3.13t:

python3.13t gil_test.py 
Python version :  3.13.0 experimental free-threading build (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Single Thread:  1.862126287072897 seconds
Multi Thread:  0.3931183419190347 seconds
Salin selepas log masuk

Saya juga mencuba dengan python3.11:

python3.11 gil_test.py 
Python version :  3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0]
Single Thread:  1.753435204969719 seconds
Multi Thread:  1.457715731114149 seconds
Salin selepas log masuk

Analisis Keputusan

Python lalai mempunyai mekanisme penguncian GIL (Global Interpreter Lock), menjadikan berbilang benang sebenarnya tidak selari. Anda boleh melihat masa pemprosesan satu utas adalah serupa dengan berbilang utas.

Dengan python3.11t (mod berulir percuma), prestasi berbilang benang jauh lebih pantas daripada berbenang tunggal. Jadi, pelbagai benang kini sebenarnya selari.

Tetapi, adakah anda melihat ujian Benang Tunggal dalam python3.13t sedikit lebih perlahan daripada pypy3.13?

Saya tidak begitu faham mengapa, jadi beritahu saya jika anda mempunyai sebarang penjelasan.

Kesimpulan

Saya fikir adalah baik untuk menggunakan multi threading dalam python untuk pemprosesan selari. Tetapi, tanpa mekanisme penguncian GIL, ia memerlukan pemaju untuk berhati-hati tentang "keselamatan benang", iaitu. berkongsi data antara urutan.

Selain itu, kita perlu menunggu kemas kini perpustakaan dan pakej untuk menyokong mod berbenang percuma sepenuhnya. Itulah salah satu sebab mengapa "mod berulir percuma" ini tidak didayakan secara lalai buat masa ini. Tetapi, saya fikir ia akan menjadi ciri yang baik pada masa hadapan.

Atas ialah kandungan terperinci Mod Berulir Percuma dalam PythonGIL dilumpuhkan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!