Percepatkan `shutil.copytree` !
Aug 28, 2024 pm 06:32 PMBincangkan mempercepatkan shutil.copytree
Tulis di sini
Ini ialah perbincangan tentang , lihat: https://discuss.python.org/t/speed-up-shutil-copytree/62078. Jika anda mempunyai sebarang idea, sila hantar kepada saya!
Latar belakang
shutil ialah moudle yang sangat berguna dalam Python. Anda boleh menemuinya dalam github: https://github.com/python/cpython/blob/master/Lib/shutil.py
shutil.copytree ialah fungsi yang menyalin folder ke folder lain.
Dalam fungsi ini, ia memanggil fungsi _copytree untuk menyalin.
Apa yang _copytree lakukan ?
- Mengabaikan fail/direktori yang ditentukan.
- Mencipta direktori destinasi.
- Menyalin fail atau direktori sambil mengendalikan pautan simbolik.
- Mengumpul dan akhirnya menimbulkan ralat yang dihadapi (mis., isu kebenaran).
- Mereplikasi metadata direktori sumber kepada direktori destinasi.
Masalah
_copytree kelajuan tidak begitu pantas apabila bilangan fail besar atau saiz fail besar.
Uji di sini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Hasilnya ialah:
tulis_dalam_5000_fail mengambil masa 4.084963083267212 saat
salinan mengambil masa 27.12768316268921 saat
Apa yang saya lakukan
Multithreading
Saya menggunakan multithread untuk mempercepatkan proses penyalinan. Dan saya menamakan semula fungsi _copytree_single_threaded menambah fungsi baharu _copytree_multithreaded. Berikut ialah copytree_multithreaded:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Saya menambah pertimbangan untuk memilih menggunakan multithread atau tidak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Ujian
Saya menulis 50000 fail dalam folder sumber. Tanda Aras:
1 2 3 4 5 6 |
|
Tulis dalam:
1 2 3 4 5 6 7 8 9 10 |
|
Dua membandingkan:
1 2 3 4 5 6 7 |
|
- "my_shutil" ialah versi shutil saya yang diubah suai.
kos salinan1 173.04780609999943s
kos copy2 155.81321870000102s
copy2 lebih cepat daripada copy1 banyak. Anda boleh berlari banyak kali.
Kelebihan & Kekurangan
Gunakan multithread boleh mempercepatkan proses penyalinan. Tetapi ia akan meningkatkan penggunaan memori. Tetapi kita tidak perlu menulis semula berbilang benang dalam kod.
Async
Terima kasih kepada "Barry Scott". Saya akan mengikut cadangan beliau :
Anda mungkin mendapat peningkatan yang sama untuk kurang overhed dengan menggunakan I/O tak segerak.
Saya menulis kod ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
|
Output:
copy1 berharga 187.21s
copy2 berharga 244.33s
copy3 berharga 111.27s
Anda dapat melihat bahawa versi async adalah lebih pantas daripada versi urutan tunggal. Tetapi versi benang tunggal lebih pantas daripada versi berbilang benang. ( Mungkin persekitaran ujian saya tidak begitu baik, anda boleh mencuba dan menghantar keputusan anda sebagai balasan kepada saya )
Terima kasih Barry Scott !
Kelebihan & Kekurangan
Async ialah pilihan yang baik. Tetapi tiada penyelesaian yang sempurna. Jika anda menemui masalah, anda boleh menghantar saya sebagai balasan.
tamat
Ini adalah kali pertama saya menulis perbincangan di python.org. Jika ada sebarang masalah, sila beritahu saya. Terima kasih.
Github Saya: https://github.com/mengqinyuan
Dev.to Saya: https://dev.to/mengqinyuan
Atas ialah kandungan terperinci Percepatkan `shutil.copytree` !. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara Menggunakan Python untuk Mencari Pengagihan Zipf Fail Teks

Bagaimana saya menggunakan sup yang indah untuk menghuraikan html?

Cara Bekerja Dengan Dokumen PDF Menggunakan Python

Cara Cache Menggunakan Redis dalam Aplikasi Django

Memperkenalkan Toolkit Bahasa Alam (NLTK)

Bagaimana untuk melakukan pembelajaran mendalam dengan Tensorflow atau Pytorch?
