Dan meskipun orang yang menggunakan skrip python untuk menulis daftar belanja atau kompilasi data sewa kompilasi oleh kepala, tetapi jika itu terjadi bahwa Anda menggunakan skrip untuk menyelesaikan tugas-tugas rutin dan kadang-kadang skrip bekerja untuk waktu yang lama tidak dapat diterima, maka mungkin idenya adalah menggunakan perhitungan malas untuk semua yang bergerak, Anda akan menyukainya.
Dalam bab-bab sebelumnya dari surat saya, saya memberikan deskripsi gratis tentang operasi perpustakaan evalcache.
Tautan: Caching Disk pada Pohon Komputer Malas
Agar tidak membuat Anda bosan dengan kebutuhan untuk mempelajari materi itu sebelum membaca ini, ringkasan singkat dari bagian terakhir:
evalcache membungkus data, fungsi, dan metode dalam objek malas. Setiap objek malas memiliki kunci hash khusus yang ditandai dengan metode konstruksinya. Operasi dapat dilakukan pada objek-objek malas, yang mengarah ke generasi objek-objek malas baru. Operasi ini terlihat persis seperti operasi pada data biasa, tetapi dalam kenyataannya tidak ada perhitungan yang dilakukan, sebaliknya, pohon objek malas yang merujuk satu sama lain dibangun, mengingat operasi dan argumennya. Jika perlu untuk mendapatkan data, operasi dilakukan untuk membuka objek malas, yang mengaktifkan rantai perhitungan, atau menarik hasil dari cache, jika objek dengan kunci ini dihitung sebelumnya.
Tentang beberapa perubahan
Sejak menulis artikel terakhir, evalcache telah mendapatkan beberapa mekanik tambahan.
Mekanik eksekusi tanpa-cache
Ternyata hash dari objek malas adalah hal yang berguna sehingga Anda ingin menggunakannya dalam situasi di mana caching objek itu sendiri tidak mungkin dan tidak perlu.
Sintaks khusus telah diperkenalkan untuk tujuan ini:
lazyhash = evalcache.LazyHash()
Dalam versi ini, objek dihitung segera pada saat pembuatan, tetapi file malas tetap dikembalikan. Ini memungkinkan Anda untuk membangun pohon perhitungan tanpa perlu men-cache beberapa objek.
Mekanisme Pengungkapan Tersirat
Pengungkapan tersirat adalah perilaku yang diharapkan dari memoizer. Meskipun evalcache awalnya dirancang bukan untuk memoisasi, tetapi untuk bekerja dengan pohon perhitungan, pengungkapan implisit berdasarkan algoritma evalcache dapat dicapai. Dua opsi baru onplace
dan onuse
diperkenalkan untuk ini. onplace mengarah ke pengungkapan objek malas segera setelah penciptaan, dan digunakan saat mencoba menggunakannya di beberapa operasi yang diizinkan untuk objek malas.
import evalcache lazy = evalcache.Lazy(cache={}, onuse=True)
Tetapi kita tidak berbicara tentang penambahan yang tidak perlu ini, yang dirancang untuk membuat perpustakaan sedikit lebih mirip dengan lenificators lainnya. Dan tentang file-file malas:
File malas
Evalcache berisi add-in untuk fungsi lenifying yang menghasilkan file. Awalnya, fungsi ini seharusnya digunakan untuk memberi kelonggaran pembuatan tangkapan layar. Ternyata nanti, menggunakan mekanisme file malas, Anda dapat melakukan hal-hal menarik lainnya.
import evalcache import evalcache.lazyfile lazyfile = evalcache.lazyfile.LazyFile(cache = evalcache.DirCache(".evalfile")) @lazyfile(field="path") def foo(data, path): f = open(path, "w") f.write(data) f.close() foo("HelloWorld","data.dat")
Bagaimana cara kerjanya ...
Secara umum, logika kerja sama dengan semua benda malas.
foo("HelloWorld","data.dat")
Mulai membangun objek malas yang kunci hashnya terkait dengan argumen yang diteruskan ke sana. Setelah itu, mekanisme pengungkapan implisit diterapkan, yang mengarah ke awal instan perhitungan.
Tapi kemudian jalannya aksi berubah.
@lazyfile(field="path")
Dekorator lazyfile mengurai parameter dengan nama yang ditentukan di bidang. Penghias berharap bahwa setelah eksekusi fungsi, sebuah file akan dibuat di sepanjang jalur ini. evalcache mengambil file ini dan membuat tautan keras ke direktori hash ".evalfile"
. Nama file tautan keras sesuai dengan kunci hash objek malas. Kemudian, ketika file dengan nama itu ada di cache, evalcache, saat memperluas objek alih-alih memanggil fungsi, cukup buat tautan keras di tempat yang diperlukan ke file yang ada di cache.
Berguna bahwa file lazy adalah objek lazy biasa, dan objek lazy lainnya dapat digunakan untuk membuatnya.
import evalcache import evalcache.lazyfile lazy = evalcache.lazy.Lazy(cache = evalcache.DirCache(".evalcache")) lazyfile = evalcache.lazyfile.LazyFile(cache = evalcache.DirCache(".evalfile")) @lazyfile(field="path") def foo(data, path): f = open(path, "w") f.write(data) f.close() @lazy def datagenerator(): return "HelloWorld" foo(datagenerator(),"data.dat")
Menerapkan lenifikasi untuk pengeditan video melalui alat moviepy.
Seperti yang Anda tahu, tugas apa pun dapat diselesaikan dengan skrip python. Himpunan pustaka Python begitu luas sehingga menemukan tugas yang tidak dicakup oleh modul Python sangat sulit.
Secara khusus, perpustakaan moviepy dan dua jam mempelajari dokumentasi untuk itu memberi kita editor video yang sederhana dan fungsional. Instalasi - tolong. Suara untuk memaksakan - tolong. Efek khusus - tolong.
Namun, seperti biasa, bekerja dengan skrip memiliki kelemahan. Setiap kali skrip dijalankan, semua artefak dibangun kembali. Saat memasang video satu jam, pengoperasian skrip semacam itu dapat bertahan sangat lama.
Menggunakan perpustakaan evalcache membantu membuat penyesuaian untuk situasi ini.
Apa yang ada disana
Kami menggunakan mekanisme eksekusi yang tidak di-cache, karena tidak ada keinginan atau kebutuhan untuk menangani caching objek moviepy. Dengan melakukan itu, kita mendapatkan semua manfaat dari objek malas untuk melacak perubahan di pohon eksekusi.
Bungkus panggilan perpustakaan di lenificators:
LazyVideoClip = lazyhash(VideoClip) VideoFileClip = lazyhash(VideoFileClip) AudioFileClip = lazyhash(AudioFileClip) CompositeVideoClip = lazyhash(CompositeVideoClip) concatenate_videoclips = lazyhash(concatenate_videoclips)
Menggunakan konstruksi ini, kami akan menghasilkan file:
@lazyfile("path") def lazy_write_videofile(path, clip): clip.write_videofile(path)
Setelah menyelesaikan operasi yang diperlukan pada urutan video, kami menulis bagian dari klip kami ke file yang terpisah. Dengan dan tanpa musik:
lazy_write_videofile("part0.mp4", part0) lazy_write_videofile("part1.mp4", part1) lazy_write_videofile("part2.mp4", part2) lazy_write_videofile("part0_mus.mp4", part0.set_audio(music.set_duration(part0.duration))) lazy_write_videofile("part1_mus.mp4", part1.set_audio(music.set_duration(part1.duration))) lazy_write_videofile("part2_mus.mp4", part2.set_audio(music.set_duration(part2.duration)))
File-file ini akan dikompilasi ulang hanya ketika cabang eksekusi yang sesuai berubah.
Ketika hasilnya selesai, kumpulkan bagian-bagian ke dalam file besar menggunakan opsi 'kompilasi':
if len(sys.argv) > 1 and sys.argv[1] == "compile": clip.lazy_write_videofile("clip.mp4", clip)
Alih-alih kesimpulan:
Teks ini menunjukkan bagaimana, dengan bantuan perpustakaan evalcache, Anda dapat memberi kelonggaran suatu algoritma yang mengasumsikan pembuatan file.
Pendekatan ini memungkinkan Anda untuk mengurangi ketergantungan pada perangkat lunak khusus atau untuk menghindari penulisan logika kompleks dari majelis selektif.
Referensi:
Proyek Github
Proyek Pypi