Halo semuanya. Hari ini kami ingin membagikan satu terjemahan bermanfaat, yang disiapkan sebelum peluncuran kursus "Pengembang web dengan Python . " Menulis kode waktu-efisien dan memori-efisien dalam Python sangat penting ketika membuat aplikasi Web, model pembelajaran mesin, atau pengujian.

Ketika saya mulai belajar generator dengan Python, saya tidak tahu betapa pentingnya mereka. Namun, mereka terus-menerus membantu saya dengan fungsi menulis sepanjang perjalanan saya melalui pembelajaran mesin.
Fungsi Generator memungkinkan Anda untuk mendeklarasikan fungsi yang akan berperilaku seperti iterator. Mereka memungkinkan pemrogram untuk membuat iterator yang cepat, sederhana, dan bersih. Iterator adalah objek yang dapat diulang (diulang). Ini digunakan untuk abstrak wadah data dan membuatnya berperilaku seperti objek yang dapat diubah. Sebagai contoh, contoh dari objek iterable dapat berupa string, daftar, dan kamus.
Generator terlihat seperti fungsi, tetapi menggunakan kata kunci hasil alih-alih kembali. Mari kita lihat contoh untuk membuatnya lebih jelas.
def generate_numbers(): n = 0 while n < 3: yield n n += 1
Ini adalah fungsi generator. Ketika Anda menyebutnya, ia mengembalikan objek generator.
>>> numbers = generate_numbers() >>> type(numbers) <class 'generator'>
Penting untuk memperhatikan bagaimana kondisi ini dienkapsulasi dalam tubuh fungsi generator. Anda dapat mengulanginya satu per satu menggunakan fungsi built-in next ():
>>> next_number = generate_numbers() >>> next(next_number) 0 >>> next(next_number) 1 >>> next(next_number) 2
Apa yang terjadi jika Anda memanggil next () setelah akhir eksekusi?
StopIteration adalah jenis pengecualian bawaan yang terjadi secara otomatis segera setelah generator berhenti memberikan hasil. Ini adalah sinyal berhenti untuk loop for.
Pernyataan hasil
Tugas utamanya adalah untuk mengontrol aliran fungsi generator sehingga terlihat seperti pernyataan kembali. Ketika fungsi generator dipanggil atau ekspresi generator digunakan, ia mengembalikan iterator khusus yang disebut generator. Untuk menggunakan generator, tetapkan ke beberapa variabel. Saat memanggil metode khusus dalam generator, seperti next (), kode fungsi akan dieksekusi sampai menghasilkan.
Ketika masuk ke pernyataan hasil, program menghentikan fungsi dan mengembalikan nilai ke objek yang memulai eksekusi. (Sedangkan pengembalian menghentikan eksekusi fungsi sepenuhnya.) Ketika fungsi ditangguhkan, statusnya dipertahankan.
Sekarang kita sudah terbiasa dengan generator di Python, mari kita bandingkan pendekatan yang biasa dengan pendekatan yang menggunakan generator dalam hal memori dan waktu yang dihabiskan untuk eksekusi kode.
Pernyataan masalah
Misalkan kita harus melalui daftar angka yang besar (misalnya, 1.000.000.000) dan menyimpan kotak semua angka yang perlu disimpan secara terpisah di daftar lain.
Pendekatan biasa
import memory_profiler import time def check_even(numbers): even = [] for num in numbers: if num % 2 == 0: even.append(num*num) return even if __name__ == '__main__': m1 = memory_profiler.memory_usage() t1 = time.clock() cubes = check_even(range(100000000)) t2 = time.clock() m2 = memory_profiler.memory_usage() time_diff = t2 - t1 mem_diff = m2[0] - m1[0] print(f"It took {time_diff} Secs and {mem_diff} Mb to execute this method")
Setelah menjalankan kode di atas, kami mendapatkan yang berikut:
It took 21.876470000000005 Secs and 1929.703125 Mb to execute this method
Menggunakan generator
import memory_profiler import time def check_even(numbers): for num in numbers: if num % 2 == 0: yield num * num if __name__ == '__main__': m1 = memory_profiler.memory_usage() t1 = time.clock() cubes = check_even(range(100000000)) t2 = time.clock() m2 = memory_profiler.memory_usage() time_diff = t2 - t1 mem_diff = m2[0] - m1[0] print(f"It took {time_diff} Secs and {mem_diff} Mb to execute this method")
Setelah menjalankan kode di atas, kami mendapatkan yang berikut:
It took 2.9999999995311555e-05 Secs and 0.02656277 Mb to execute this method
Seperti yang dapat kita lihat, runtime dan memori yang digunakan berkurang secara signifikan. Generator beroperasi dengan prinsip yang dikenal sebagai "komputasi malas." Ini berarti mereka dapat menghemat prosesor, memori, dan sumber daya komputasi lainnya.
Kesimpulan
Saya harap dalam artikel ini saya bisa menunjukkan bagaimana generator di Python dapat digunakan untuk menghemat sumber daya seperti memori dan waktu. Keuntungan ini muncul karena fakta bahwa generator tidak menyimpan semua hasil dalam memori, tetapi menghitungnya dengan cepat, dan memori hanya digunakan jika kami meminta hasil perhitungan. Generator juga memungkinkan Anda untuk mengabstraksi sejumlah besar kode boilerplate, yang diperlukan untuk menulis iterator, sehingga mereka juga membantu mengurangi jumlah kode.