Өндүрүмдүүлүк жана профилдөө
Адегенде өлчө, тар жерди оптималдаштыр, анан кайра өлчө
timeit жана cProfile сыяктуу куралдар менен өлчөйсүз, наркы кириш маалыматтын өлчөмү (big-O) менен кандай өсөрүн ойлонуп, андан кийин гана дал ошол маанилүү бөлүктү өзгөртөсүз — көбүнчө жакшыраак алгоритмди же маалымат структурасын тандап, кайталанган ишти кэштеп же тыгыз циклдерди векторлоштурулган операцияларга которуп. Калган кодду түшүнүктүү жана жөнөкөй калтырыңыз.
- кичине үзүндүнү
timeitменен туура өлчөп, анын кеңири таралган тузактарынан качуу, - бүтүн программаны
cProfileменен профилдеп,pstatsотчётун окуу, - big-O өсүшүн окуп, аны реалдуу убакыт менен байланыштыруу,
O(n)мүчөлүк текшерүүсүнset/dictаркылууO(1)кылып алмаштыруу,- кайталанган ишти
functools.lru_cacheменен кэштөө, - ысык циклди кол менен жазуунун ордуна качан векторлоштуруу керектигин түшүнүү.
1. Божомолдобо, өлчө
Өндүрүмдүүлүк боюнча иштин биринчи эрежеси: "эмне жай" деген программисттин интуициясы адатта туура эмес. Интерпретатор, операциялык система, эстутум кэштери жана китепканалардын ичи кодду окуу менен алдын ала айтуу кыйын болгондой аракеттешет. Ошондуктан кесипкөй цикл мындай: өлчө -> тар жерди тап -> бир нерсени өзгөрт -> кайра өлчө.
Байланыштуу эреже: маанилүү нерсени гана оптималдаштыр. Ишке киргенде бир жолу аткарылган функция циклдин ичинде он миллион жолу чакырылган функциянын көңүлүн талап кылбайт. Дональд Кнуттун атактуу сөзү — "эрте оптималдаштыруу — бардык жамандыктын тамыры" — чындыгында күчтү актабаган жерге сарптабоо жөнүндө. Түшүнүктүү код — бул стандарт; тактыкты ылдамдыкка далилденген тар жерде гана алмаштырасыз.
timeit) "бул эки кичине үзүндүнүн кайсынысы ыкчам?" деген суроого жооп берет. Профилдөөчү (cProfile) "бул бүтүн программада убакыт чын эле кайда кетет?" деген суроого жооп берет. Ылайыктуусун тандаңыз.