Python-da kodni tezlashtirishning 3 oson usuli
Javohir PythonAgar siz Python dasturchisi bo'lsangiz, ehtimol kodni qanday tezlashtirish haqida o'ylab ko'rgansiz. Maqolada biz bunga yordam beradigan 3 ta usulni tahlil qilamiz.
Python kuchli va moslashuvchan dasturlash tilidir. Biroq, dinamik yozish va talqin qilish tufayli uning ishlashi juda ko'p narsani talab qiladi. Va, ehtimol, uzoq vaqt davomida uni ishlab chiqqan har bir kishi Python-da kodni qanday tezlashtirishni qiziqtirgan. Ushbu maqolada biz bitta ish misolida uchta usulni ko'rib chiqamiz.
Python-da kodni tezlashtirish ishi
Raqamlarning katta ro'yxati elementlarining kvadratlari yig'indisini hisoblaydigan oddiy funktsiyani ko'rib chiqing.

Va endi biz kodni tezlashtirish usullarini qo'llaymiz va ularning har biri dasturning tezligiga qanday ta'sir qilishini kuzatamiz.
1. List comprehension

List comprehension - bu 1 ta satrda ro'yxatlar yaratish va qayta ishlashning samarali usuli. Pythonda u an'anaviy for loopiga qaraganda tezroq ishlaydi, chunki undagi butun jarayon optimallashtirilgan va tarjimon ichida ishlaydi.
List comprehensions odatda for ga qaraganda kamroq usullarni chaqiradi. Ikkinchisi har bir iteratsiya uchun append usulini chaqiradi, bu esa qo'shimcha yuk hosil qiladi va har bir iteratsiyada o'zgaruvchining holatini yangilaydi. Va list comprehension darhol yangi ro'yxatni yaratadi, bu yondashuv yanada samarali bo'lishi mumkin.
Shuni ta'kidlash kerakki, list comprehension odatda tezroq bo'lsa-da, uni har doim ham ishlatmaslik kerak. Agar siz oddiy ma'lumotlarni o'zgartirishdan ko'ra qiyinroq ish qilmoqchi bo'lsangiz, uni tushunish qiyin bo'lishi mumkin. Aniq va o'qilishi mumkin bo'lgan for tsikli eng yaxshi tanlov bo'lishi mumkin.
2. Map() va lambda-funksiyalari

map() — har doim iteratsiya qilinadigan ketma-ketlik bilan birgalikda ishlatiladigan o'rnatilgan funksiya, bu holda ro'yxat bilan. U ketma-ketlikning har bir elementini (ya'ni ro'yxatdagi har bir ob'ektga) kuzatib boradi va unga birinchi pozitsion argument tomonidan qabul qilingan funktsiyani qo'llaydi.
map() tezroq Si-da amalga oshiriladi. Va list comprehension singari, Python tarjimoni darajasida optimallashtirilgan. Ya'ni, uni ishlatishda siz barcha ishlarni operatsiyani optimallashtiradigan tarjimonga topshirasiz.
Bundan tashqari, Python-dagi map() ro'yxatni emas, balki iteratorni qaytaradi. Va iteratorlar katta hajmdagi ma'lumotlarni qayta ishlashning yanada samarali usuli hisoblanadi. Ular bir vaqtning o'zida butun ma'lumotlar to'plamini xotiraga yuklashni talab qilmaydi, lekin kerak bo'lganda har bir elementni yaratadi. Bu, ayniqsa, katta ma'lumotlar to'plamlari bilan ishlashda xotira sarfini sezilarli darajada kamaytiradi.
Bu, shuningdek, "dangasa hisoblash" printsipi bilan bog'liq: map () funktsiyasi bilan qaytarilgan iterator har bir elementni "tezda" hisoblab chiqadi va faqat kerak bo'lganda.
Python-dagi Lambda funktsiyalari-bu foydalanish joyida aniqlanishi mumkin bo'lgan anonim funktsiyalar. Ya'ni, def orqali alohida nomlangan funktsiyani o'rnatish o'rniga, siz qisqa lambda yozishingiz mumkin — to'g'ridan-to'g'ri map () chaqiruvida.
3. NumPy va Pandas

NumPy-bu n o'lchovli massiv massivlarini samarali operatsiyalar bilan ta'minlaydigan kuchli kutubxona. Katta ma'lumotlar massivlari bilan ishlashda numpy optimallashtirilgan va vektorli operatsiyalar tufayli standart Python ro'yxatlariga qaraganda ancha samarali bo'lishi mumkin.

Pandas-bu samarali ma'lumotlar tuzilmalari va ma'lumotlarni tahlil qilish vositalarini taqdim etadigan kutubxona.
Bu aslida numpy ustidagi qo'shimcha. Shunday qilib, kodni tezlashtirish uchun loyihada allaqachon o'rnatilgan kutubxonadan foydalanish mantiqan to'g'ri keladi.
Asosan, Numpy va Pandas, masalan, Excel jadvalini tushirish yoki katakchalarni saralash kerak bo'lganda jadvallar bilan ishlash uchun ishlatiladi. Boshqa sohalar — kompyuterni ko'rish, vektor geometriyasi va boshqalar.
NumPy va Pandas ishlatadigan kod ko'pincha o'xshash kodga qaraganda tezroq ishlaydi, lekin standart Python funktsiyalari va ma'lumotlar tuzilmalari yordamida yoziladi. Va bu qanday sabablarga ko'ra:
Numpy va Pandas kutubxonalarining aksariyati C va C++tillarida yozilgan. Buning yordamida bajarish tezligi tezroq bo'ladi.
Vektorlashtirilgan operatsiyalar element bo'yicha emas, balki darhol ma'lumotlar massivlarida amalga oshiriladi. Bu, ayniqsa, katta hajmdagi ma'lumotlar bilan ishlashda unumdorlikni sezilarli darajada oshiradi.
Xotiradan samarali foydalanish. NumPy va Pandas kamroq xotirani egallaydigan va operatsiyalarni tezroq bajarishga imkon beradigan samarali ma'lumotlar tuzilmalaridan foydalanadi.
Funktsiyalar katta hajmdagi ma'lumotlarni tezda bajarish uchun optimallashtirilgan.
Natijalar
Har bir yondashuvning bajarilish vaqti mashinaga va muayyan holatga bog'liq bo'ladi, ammo taxminiy ravishda quyidagi natijalarni taqdim etish mumkin:
standart yondashuv: 0.25 soniya;
map va lambda: 0.18 soniya;
list comprehension: 0.17 soniya;
NumPy: 0.006 soniya;
Pandas: 0.006 soniya.
Ko'rib turganingizdek, optimallashtirish Python-da kodni sezilarli darajada tezlashtirishi mumkin. Ammo shuni unutmangki, har qanday yondashuvning maqbulligi ma'lum bir holatga bog'liq va har doim ham o'qish va qo'llab-quvvatlashga zarar etkazadigan maksimal ijro tezligiga intilish kerak emas (list comprehension, uning ichida yana ikkita list comprehension, map va lambda funktsiyalari-barchasi bitta satrda, albatta, kodni tezlashtiradi, lekin uni o'qing qiyin bo'ladi).
Ko'pgina hollarda, tanlov qaysi variant kodni yanada tushunarli va qo'llab-quvvatlashiga asoslangan bo'lishi kerak.