Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa

Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa

WBOY
WBOYke hadapan
2022-04-19 17:25:172919semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang python terutamanya isu yang berkaitan dengan pembangunan perangkak berbilang benang dan algoritma carian biasa Mari kita lihat bersama-sama .

Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa

Pembelajaran yang disyorkan: tutorial video python

Perangkak berbilang benang

Kelebihan berbilang benang

Selepas menguasai permintaan dan ungkapan biasa, anda boleh mula merangkak beberapa URL mudah sebenarnya.
Walau bagaimanapun, perangkak pada masa ini hanya mempunyai satu proses dan satu utas, jadi ia dipanggil perangkak satu benang . Perangkak satu benang hanya melawat satu halaman pada satu masa dan tidak boleh menggunakan lebar jalur rangkaian komputer sepenuhnya. Satu halaman hanya beberapa ratus KB paling banyak, jadi apabila perangkak merangkak halaman, kelajuan rangkaian tambahan dan masa antara memulakan permintaan dan mendapatkan kod sumber akan sia-sia. Jika perangkak boleh mengakses 10 halaman pada masa yang sama, ia bersamaan dengan meningkatkan kelajuan merangkak sebanyak 10 kali ganda. Untuk mencapai tujuan ini, perlu menggunakan teknologi multi-threading.

Bahasa Python mempunyai kunci penterjemah global (Global Interpreter Lock, GIL). Ini menyebabkan berbilang threading Python menjadi pseudo-multi-threading, iaitu, ia pada asasnya adalah benang, tetapi benang ini hanya melakukan setiap perkara untuk beberapa milisaat Selepas beberapa milisaat, ia menyimpan pemandangan dan melakukan perkara lain, dan kemudian lakukan perkara lain selepas beberapa milisaat Selepas satu pusingan, kembali ke perkara pertama, sambung semula adegan, bekerja selama beberapa milisaat, dan teruskan menukar... Satu utas pada skala mikro adalah seperti melakukan beberapa perkara di bahagian. masa yang sama pada skala makro. Mekanisme ini mempunyai sedikit impak pada operasi intensif I/O (Input/Output, input/output), tetapi pada operasi intensif pengiraan CPU, kerana hanya satu teras CPU boleh digunakan, ia akan memberi kesan yang ketara terhadap prestasi Besar kesan. Oleh itu, jika anda terlibat dalam program intensif pengiraan, anda perlu menggunakan pelbagai proses Python tidak terjejas oleh GIL. Perangkak ialah program intensif I/O, jadi menggunakan berbilang benang boleh meningkatkan kecekapan merangkak.

Pustaka berbilang pemprosesan: berbilang pemprosesan

Berbilang pemprosesan itu sendiri ialah perpustakaan berbilang pemprosesan Python, digunakan untuk mengendalikan operasi yang berkaitan dengan berbilang pemprosesan. Walau bagaimanapun, memandangkan memori dan sumber tindanan tidak boleh dikongsi secara langsung antara proses, dan kos memulakan proses baharu adalah jauh lebih besar daripada benang, menggunakan berbilang benang untuk merangkak mempunyai lebih banyak kelebihan berbanding menggunakan berbilang proses.

Terdapat modul tiruan di bawah pemproses berbilang, yang membolehkan benang Python menggunakan pelbagai kaedah pemproses berbilang.
Terdapat kelas Pool under dummy, yang digunakan untuk melaksanakan pool thread.
Kumpulan benang ini mempunyai kaedah map(), yang membenarkan semua utas dalam kumpulan benang melaksanakan fungsi "secara serentak".

Contohnya:
Selepas mempelajari gelung for

for i in range(10):
	print(i*i)

Sudah tentu anda boleh mendapatkan hasil dengan cara penulisan ini, tetapi kod dikira satu demi satu, dan kecekapannya tidak Tidak tinggi. Jika anda menggunakan teknologi berbilang benang untuk membenarkan kod mengira kuasa dua banyak nombor pada masa yang sama, anda perlu menggunakan multiprocessing.dummy untuk mencapainya:

Contoh penggunaan berbilang benang:

from multiprocessing.dummy import Pooldef cal_pow(num):
    return num*num
pool=Pool(3)num=[x for x in range(10)]result=pool.map(cal_pow,num)print('{}'.format(result))

di atas Dalam kod, mula-mula mentakrifkan fungsi untuk mengira segi empat sama, dan kemudian memulakan kumpulan benang dengan tiga utas. Ketiga-tiga benang ini bertanggungjawab untuk mengira kuasa dua 10 nombor Sesiapa yang selesai mengira nombor di tangan dahulu akan mengambil nombor seterusnya dan meneruskan pengiraan sehingga semua nombor dikira.

Dalam contoh ini, Kaedah map() kumpulan benang menerima dua parameter Parameter pertama ialah nama fungsi, dan parameter kedua ialah senarai. Nota: Parameter pertama hanyalah nama fungsi dan tidak boleh mengandungi kurungan . Parameter kedua ialah objek lelaran Setiap elemen dalam objek lelaran ini akan diterima sebagai parameter oleh fungsi clac_power2(). Selain senarai, tupel, set atau kamus boleh digunakan sebagai parameter kedua map().

Pembangunan perangkak berbilang benang

Memandangkan perangkak adalah operasi intensif I/O, terutamanya apabila meminta kod sumber halaman web, jika anda menggunakan satu utas untuk membangunkan, banyak masa akan sia-sia. Menunggu halaman web kembali, jadi menggunakan teknologi berbilang benang pada perangkak boleh meningkatkan kecekapan operasi perangkak. Berikan satu contoh. Ia mengambil masa 50 minit untuk mencuci pakaian dalam mesin basuh, 15 minit untuk mendidih air dalam cerek, dan 1 jam untuk menghafal perbendaharaan kata. Kalau tunggu mesin basuh basuh baju dulu, baru masak air selepas baju dicuci, kemudian baca kosa kata selepas air masak, ambil masa 125 minit.

Tetapi jika anda melihatnya dengan cara lain, secara keseluruhannya, 3 perkara boleh berjalan pada masa yang sama andaikan anda tiba-tiba mempunyai dua orang lain, salah seorang daripadanya bertanggungjawab untuk memasukkan pakaian ke dalam mesin basuh dan menunggu mesin basuh selesai, orang lain bertanggungjawab untuk mendidih air dan menunggu air mendidih, dan anda hanya perlu menghafal perkataan. Apabila air mendidih, klon yang bertanggungjawab untuk mendidihkan air hilang terlebih dahulu. Apabila mesin basuh selesai mencuci pakaian, klon yang bertanggungjawab untuk mencuci pakaian hilang. Akhirnya, anda menghafal sendiri perkataan tersebut. Hanya mengambil masa 60 minit untuk menyelesaikan 3 perkara pada masa yang sama.

Sudah tentu anda pasti akan mendapati contoh di atas bukanlah situasi sebenar dalam kehidupan. Pada hakikatnya, tiada siapa yang dipisahkan. Apa yang berlaku dalam kehidupan sebenar ialah apabila orang menghafal perkataan, mereka menumpukan untuk menghafalnya; . Jadi hanya ambil tindakan yang sepadan apabila peringatan itu datang. Tidak perlu menyemak setiap minit. Kedua-dua perbezaan di atas sebenarnya adalah perbezaan antara model tak segerak berbilang benang dan dipacu peristiwa. Bahagian ini bercakap tentang operasi berbilang benang dan kami akan bercakap tentang rangka kerja perangkak menggunakan operasi tak segerak kemudian. Kini anda hanya perlu ingat bahawa apabila bilangan tindakan yang perlu dikendalikan tidak besar, tiada perbezaan dalam prestasi kedua-dua kaedah, tetapi apabila bilangan tindakan meningkat dengan ketara, peningkatan kecekapan berbilang benang akan berkurangan, malah lebih teruk daripada single-threading . Dan pada masa itu, hanya operasi tak segerak adalah penyelesaian kepada masalah itu.

Dua keping kod berikut digunakan untuk membandingkan perbezaan prestasi antara perangkak satu benang dan perangkak berbilang benang dalam merangkak halaman utama bd: Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa
Seperti yang dapat dilihat daripada hasil yang sedang dijalankan, satu benang mengambil masa kira-kira 16.2s, 5 Benang mengambil masa kira-kira 3.5s, iaitu kira-kira satu perlima daripada masa satu benang. Anda juga boleh melihat kesan lima utas "berjalan serentak" dari perspektif masa. Tetapi ini tidak bermakna bahawa lebih besar kolam benang, lebih baik. Ia juga boleh dilihat daripada keputusan di atas bahawa masa berjalan lima utas sebenarnya lebih sedikit daripada satu perlima daripada masa berjalan satu utas. Titik tambahan sebenarnya ialah masa penukaran benang. Ini juga mencerminkan dari sisi bahawa pelbagai benang Python masih bersiri pada tahap mikro. Oleh itu, jika kumpulan benang ditetapkan terlalu besar, overhed yang disebabkan oleh penukaran benang mungkin mengimbangi peningkatan prestasi yang dibawa oleh berbilang benang. Saiz kumpulan benang perlu ditentukan berdasarkan keadaan sebenar, dan tiada data yang tepat. Pembaca boleh menetapkan saiz yang berbeza untuk ujian dan perbandingan dalam senario aplikasi tertentu untuk mencari data yang paling sesuai.

Algoritma carian biasa untuk perangkak

Carian pertama mendalam

Klasifikasi kursus tapak web pendidikan dalam talian perlu dirangkak maklumat kursus. Bermula dari halaman utama, kursus dibahagikan kepada beberapa kategori utama, seperti Python, Node.js dan Golang mengikut bahasa. Terdapat banyak kursus di bawah setiap kategori utama, seperti crawler, Django dan pembelajaran mesin di bawah Python. Setiap kursus dibahagikan kepada banyak jam kelas.

Dalam kes carian mendalam-pertama, laluan merangkak adalah seperti yang ditunjukkan dalam rajah (nombor siri dari kecil ke besar)
Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa

Carian keluasan didahulukan

Jujukan Pemilihan algoritma adalah seperti berikut
Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa

Contohnya, jika anda ingin merangkak semua maklumat restoran tapak web di seluruh negara dan maklumat pesanan setiap restoran. Dengan mengandaikan bahawa algoritma depth-first digunakan, kemudian mula-mula merangkak ke restoran A dari pautan tertentu, dan kemudian merangkak serta-merta maklumat pesanan restoran A. Memandangkan terdapat ratusan ribu restoran di seluruh negara, ia mungkin mengambil masa 12 jam untuk mendaki kesemuanya. Masalah yang ditimbulkan oleh ini ialah jumlah tempahan restoran A mungkin mencecah pukul 8 pagi, manakala jumlah pesanan restoran B mungkin mencecah pukul 8 malam. Jumlah pesanan mereka berbeza sebanyak 12 jam. Untuk restoran popular, 12 jam boleh mengakibatkan jurang hasil berjuta-juta. Dengan cara ini, apabila melakukan analisis data, perbezaan masa 12 jam akan menyukarkan untuk membandingkan prestasi jualan restoran A dan B. Berbanding dengan jumlah pesanan, perubahan volum restoran adalah lebih kecil. Oleh itu, jika anda menggunakan carian breadth-first, mula-mula merangkak semua restoran dari 0:00 tengah malam hingga 12:00 tengah hari keesokan harinya, kemudian fokus pada merangkak jumlah pesanan setiap restoran dari 14:00 hingga 20 :00 keesokan harinya. Dengan cara ini, hanya mengambil masa 6 jam untuk menyelesaikan tugas merangkak pesanan, mengecilkan perbezaan dalam volum pesanan yang disebabkan oleh perbezaan masa. Pada masa yang sama, memandangkan rangkak kedai setiap beberapa hari memberi sedikit kesan, bilangan permintaan juga telah dikurangkan, menjadikannya lebih sukar untuk perangkak ditemui oleh tapak web.

Untuk contoh lain, untuk menganalisis pendapat umum masa nyata, anda perlu merangkak Baidu Tieba. Forum popular mungkin mempunyai puluhan ribu halaman siaran, dengan mengandaikan siaran terawal bermula pada tahun 2010. Jika carian breadth-first digunakan, mula-mula dapatkan tajuk dan URL semua siaran dalam Tieba ini, kemudian masukkan setiap siaran berdasarkan URL ini untuk mendapatkan maklumat pada setiap tingkat. Walau bagaimanapun, memandangkan ia adalah pendapat umum masa nyata, siaran dari 7 tahun yang lalu tidak begitu penting untuk analisis semasa Apa yang lebih penting ialah siaran baharu, jadi kandungan baharu harus ditangkap terlebih dahulu. Berbanding dengan kandungan masa lalu, kandungan masa nyata adalah yang paling penting. Oleh itu, untuk merangkak kandungan Tieba, carian depth-first harus digunakan. Apabila anda melihat siaran, masuk dengan cepat dan merangkak maklumat setiap tingkat Selepas merangkak satu siaran, anda boleh merangkak ke siaran seterusnya. Sudah tentu, kedua-dua algoritma carian ini bukan sama ada/atau Mereka perlu dipilih secara fleksibel mengikut situasi sebenar Dalam banyak kes, ia boleh digunakan pada masa yang sama.

Pembelajaran yang disyorkan: tutorial video python

Atas ialah kandungan terperinci Analisis terperinci Python tentang perangkak berbilang benang dan algoritma carian biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam