+− THE DAILY DIFFdev & AI news
SHIP IT

Prestasi Python: gelung NumPy asli, panggilan balik dan kos penukaran

Ujian berangka khusus CPU sahaja mengikut nilai yang serupa melalui gelung CPython, aritmetik NumPy, pembalut panggilan balik Python dan gelung Numba yang dikompilasi.

Want to see our stories first on Google? Add us to your preferred sources — it helps us grow.

Ujian berangka khusus CPU sahaja mengikut nilai yang serupa melalui gelung CPython, aritmetik NumPy, pembalut panggilan balik Python dan gelung Numba yang dikompilasi. NumPy sedia-input mempunyai kelebihan besar, manakala penukaran dari dan kembali ke senarai Python mengurangkan kelebihan itu menjadi hampir seri. Episod ini menerangkan sempadan pelaksanaan dan cara mengukur hasil yang diperlukan oleh aplikasi.

Baca edisi bertulis (Bahasa Inggeris) ↗

Apa yang diliputi video ini

  • CPython mengkompilasi sumber kepada bytecode. Kerja penterjemah/objek berulang dan gelung berangka asli berjenis adalah susunan pelaksanaan yang berbeza.
  • Aritmetik berangka NumPy boleh menyerahkan kelompok bertipe kepada operasi yang dikompilasi; gelung aritmetik masih wujud, dan pandangan boleh mempunyai susun atur yang tidak bersebelahan.
  • Ukur penukaran dan representasi output yang diperlukan. Dalam larian ini, menukar senarai Python menjadi tatasusunan dan kembali memadamkan kelebihan tatasusunan sedia besar.
  • Beban kerja kecil boleh mengutamakan Python biasa kerana kos panggilan tatasusunan tetap penting. Pemahaman lapan nilai memenangi perbandingan yang diukur ini.
  • np.vectorize ialah pembalut kemudahan yang memanggil Python untuk elemen berturut-turut; antara muka kelompok sahaja tidak mewujudkan pelaksanaan berangka asli.
  • Gelung sintaks Python yang dikompilasi juga boleh menjadi pantas. Sertakan kos kompilasi/penyediaan sejuk apabila ia penting kepada pemanggil.
  • Pelaksanaan asli, CPU SIMD, berbilang benang dan bahagian belakang GPU adalah idea yang berasingan. Ciri CPU yang tersedia tidak mengesan arahan yang digunakan dalam larian tertentu.

Transkrip terjemahan

Diterjemahkan daripada penceritaan asal Bahasa Inggeris. Audio dan kapsyen yang tersedia dikawal oleh YouTube.

Mengapa CPU yang sama boleh selesai lebih awal?

0:00 Anda rasa Python memerlukan bahasa baru untuk menjadi pantas. CPU yang sama menjalankan kelompok kami lebih pantas selepas gelung bergerak. Ke mana perginya kerja itu? Bilakah peningkatan kelajuan hilang? Pintasan mana yang membawa Python kembali? Ini adalah The Daily Diff, di sebalik tabir. Perhatikan pintasan itu. CPython adalah pelaksanaan Python standard.

0:17 Ia mengkompilasi sumber anda menjadi bytecode, kemudian menjalankan arahan tersebut dalam penterjemah. NumPy adalah pustaka berangka yang tatasusunannya memegang nilai dengan jenis data yang diisytiharkan. Aritmetik terbina dalamnya boleh menyerahkan seluruh kelompok kepada operasi yang dikompilasi. Ambil satu juta nilai apungan, kuasa duakan setiap satu, kemudian tambah nilai asal. Setiap versi mendapat nilai yang sama dan menghasilkan jawapan yang sepadan. Nilai-nilai itu cukup kecil untuk mengelakkan perbezaan pembulatan daripada perlumbaan.

0:40 Pada mesin ini, pemahaman mengambil masa kira-kira tiga puluh tiga milisaat. NumPy mengambil masa kurang dari satu. Kedua-duanya berjalan di CPU. Itu adalah bukti yang berguna untuk beban kerja ini, dan obituari yang teruk untuk bahasa pengaturcaraan. Mulakan dengan gelung biasa.

Apakah kerja yang diulang oleh gelung Python?

0:53 Python mendapatkan nilai seterusnya, melakukan aritmetik, dan menambah jawapan. Kemudian ia melakukannya lagi. Pendaraban itu murah. Mengatur pendaraban seterusnya, dan mengendalikan objek Python di sekelilingnya, menambah kerja setiap kali. Ini adalah disasembli sebenar fungsi yang diuji. Iterasi, pendaraban dan penambahan muncul sebagai arahan bytecode. Versi dan penterjemah Python membuat pilihan yang berbeza.

1:14 Pemasaan ini adalah milik versi pada skrin, iaitu Python tiga perpuluhan sepuluh. Senarai Python menyimpan rujukan kepada objek, jadi pelbagai jenis perkara boleh berkongsi senarai. Tugas aritmetik kami menggunakan nombor sepanjang masa. Ia membayar untuk susunan umum sambil meminta perkhidmatan berulang. Bayangkan memesan kopi yang sama sejuta kali dan mengisi borang baru untuk setiap cawan. Mesin kopi baik-baik saja.

1:36 Kerja kertas telah mengembangkan kerjayanya sendiri.

Ke mana NumPy menggerakkan gelung?

1:38 NumPy mengubah kontrak. Tatasusunan ini memegang nilai titik apungan bersaiz tetap dengan satu jenis yang diisytiharkan. Tatasusunan kami adalah bersebelahan, jadi nilai-nilainya duduk bersama dalam memori. Pandangan boleh mempunyai susun atur lain. Operasi aritmetik tahu jenis data yang diterimanya. Panggilan menyerahkan kelompok itu kepada operasi asli. Gelung masih melawat nilai-nilai di dalam kod yang dikompilasi. Ia boleh menggunakan semula pengetahuan jenis merentasi kerja itu.

2:00 Python kekal sebagai orang yang menyerahkan tugas itu. Itamar Turner Trauring menjelaskan perbezaan dalam Python Speed. Antara muka kelompok, pelaksanaan asli dan arahan vektor pemproses adalah perkara yang berasingan. Nama fungsi menyediakan sangat sedikit bukti.

Adakah pantas bermakna GPU atau banyak teras CPU?

2:13 Hasil ini menggunakan NumPy pada CPU. Backend GPU seperti CuPy memilih rumah yang berbeza untuk tatasusunan dan operasi. Membeli GPU meninggalkan gelung Python biasa ini berjalan di tempat ia sudah berjalan. Arahan vektor CPU boleh memproses beberapa nilai bersama. NumPy mempunyai jentera untuk memilih kernel yang disokong. Waktu jalan kami melaporkan ciri-ciri yang tersedia, tetapi tidak mengesan arahan ungkapan ini. Memberikan seluruh keuntungan yang diukur kepada arahan vektor akan menjual bukti secara berlebihan.

2:40 Troli beli-belah GPU boleh kekal tertutup. Ada sesuatu yang sangat memuaskan tentang pembetulan prestasi yang juga membatalkan pembelian. Malangnya, penanda aras berterusan.

Bilakah peningkatan kelajuan yang mengagumkan hilang?

2:49 Dengan lapan nilai, pemahaman menang. Memanggil jentera tatasusunan menelan belanja lebih daripada tugas kecil itu. Tatasusunan sedia yang lebih besar mendahului. Kami menggunakan percubaan berulang dan proses yang dipanaskan. Binaan Python yang lebih baru boleh mengubah titik persilangan. Kemudian ubah apa yang diperlukan oleh aplikasi. Mulakan dengan senarai Python dan tamatkan dengan senarai Python yang baru. NumPy mesti menukar input menjadi tatasusunan dan menukar jawapan kembali menjadi objek

3:11 Python. Langkah-langkah itu perlu disertakan dalam bil jika aplikasi anda memerlukannya. Pada satu juta nilai, laluan lengkap itu mengambil masa kira-kira dua puluh lapan milisaat. Pemahaman mengambil masa kira-kira dua puluh lapan juga. Kelebihan dramatik kami menjadi hampir seri. Bahagian yang pantas itu nyata. Kelebihan itu bergantung pada membiarkan data kekal dalam bentuk numeriknya.

Sempadan mana yang termasuk dalam penanda aras?

3:28 Ikuti data. Jika operasi seterusnya menerima tatasusunan, simpan tatasusunan itu. Jika anda berulang kali menukar antara senarai dan tatasusunan, ukur persilangan tersebut. Berhenti sebelum penyerahan yang mahal memberikan nombor yang tepat untuk soalan yang salah. Mendarabkan tatasusunan ini menghasilkan hasil sementara. Menambah nilai asal menghasilkan output. Pelaksanaan asli masih memerlukan memori dan memindahkan data.

3:47 Sesetengah operasi menerima penimbal output, mengurangkan peruntukan apabila kod anda boleh menggunakannya semula dengan selamat. Satu baris cantik boleh memesan beberapa penimbal besar. Python Speed juga menyuarakan masalah ini. Penguntuk sangat tidak peduli dengan estetika anda.

Bolehkah gelung Python yang dikompilasi menjadi pantas juga?

4:00 Anda juga boleh mengekalkan sintaks gelung dan mengubah pelaksanaannya. Numba boleh mengkompilasi fungsi Python berangka yang disokong menjadi kod asli. Ini adalah gelung dari ujian kami dengan dekorator kompilernya. Ia masih mengatakan for. Laluan penterjemah yang mahal telah berubah. Selepas kompilasi, gelung ini mengambil masa kurang dari setengah milisaat dengan tatasusunan sedia. Kompilasi itu sendiri mengambil masa kira-kira satu saat dalam larian ini. Kos persediaan itu dikecualikan dari pemasaan berulang,

4:22 jadi tugas sekali sahaja yang kecil memerlukan perbandingan yang berbeza. Panduan Numba sendiri gembira untuk menunjukkan gelung eksplisit. Memulakan migrasi bahasa sebelum mencari laluan panas adalah cara yang rumit untuk mengelak daripada membuka profiler. Mula-mula cari apa yang menghabiskan masa. Penantian rangkaian, penghuraian objek dan aritmetik pukal memerlukan pembetulan yang berbeza. Operasi tatasusunan asli membantu apabila pengiraan dan data sesuai.

4:43 Ukur hasil yang sebenarnya diperlukan oleh pemanggil anda. Sekarang untuk pintasan itu. Anda mempunyai fungsi Python dan mahu ia menerima tatasusunan. Pembalut bernama vectorize kedengaran seperti butang prestasi yang hilang. Dokumentasinya mempunyai ayat penting yang menunggu.

Apa yang sebenarnya dilaksanakan oleh np.vectorize?

4:56 NumPy mengatakan pembalut vectorizenya disediakan terutamanya untuk kemudahan. Pelaksanaannya pada dasarnya adalah gelung for. Pembalut menerima kelompok, tetapi terus memanggil fungsi Python anda untuk elemen berturut-turut. Antara muka menjadi lebih pendek. Sempadan pelaksanaan kekal sibuk. Perhatikan nilai yang sama kembali melalui panggilan balik Python. Dengan tatasusunan sedia, versi ini mengambil masa kira-kira lapan puluh tujuh milisaat. Ia lebih perlahan daripada pemahaman kami.

5:18 Pembalut penyiaran yang berguna boleh mengekalkan kerja per-elemen tepat yang anda cuba hapuskan. Periksa pelaksanaan di sebalik antara muka kelompok, simpan data yang serasi dalam bentuknya yang berguna, dan sertakan penukaran dalam perbandingan. Gelung asli, panggilan balik dan yang dikompilasi boleh kelihatan serupa dari sudut pemanggil. Nama vectorize membuat janji yang jam randik anda tidak pernah tandatangani. Simpan ia apabila kemudahan adalah apa yang anda perlukan. Untuk prestasi, periksa gelung yang berjalan.

Apa yang perlu anda ubah dalam kod anda?

5:41 Keputusan saya ialah SHIP IT untuk membundel laluan panas berangka yang diukur. Kekalkan gelung biasa apabila ia sudah berfungsi dengan baik. Periksa di mana kerja berlaku dan apa yang diperlukan oleh pemanggil seterusnya. Langgan, tekan loceng, dan beritahu saya di komen jika anda akan mengecapnya secara berbeza. Dan itu adalah perbezaan untuk hari ini. Saya Niko dari Axrisi. Gabungkan dengan bertanggungjawab.

Sumber

  1. Universal functions (ufunc) basics — NumPy 2.2NumPy
  2. The N-dimensional array — NumPy 2.2NumPy
  3. numpy.vectorize — convenience and performance notesNumPy
  4. CPU/SIMD optimizations — NumPy 2.2NumPy
  5. dis — Disassembler for Python bytecodePython Software Foundation
  6. CPython 3.10.12 list representationCPython contributors
  7. The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
  8. Performance TipsNumba
  9. Basics of CuPyCuPy

Video berkaitan