วิธีเพิ่มประสิทธิภาพโค้ด Python ของคุณด้วยเครื่องมือสร้างโปรไฟล์

Withi Pheim Prasiththiphaph Khod Python Khxng Khun Dwy Kheruxng Mux Srang Porfil



การเพิ่มประสิทธิภาพโค้ด Python ถือเป็นทักษะอันมีค่าสำหรับนักพัฒนา เครื่องมือการทำโปรไฟล์ถือเป็นสิ่งสำคัญในกรณีนี้ และอำนวยความสะดวกในการตรวจจับข้อจำกัดและความไร้ประสิทธิภาพของโค้ด บทความนี้จะตรวจสอบวิธีการใช้เครื่องมือสร้างโปรไฟล์เพื่อปรับปรุงโปรแกรม Python ด้วยการเชี่ยวชาญการวัดเวลาดำเนินการ การใช้หน่วยความจำ และการเรียกใช้ฟังก์ชันของความถี่ เราจึงสามารถปรับปรุงได้อย่างแม่นยำ

การเพิ่มประสิทธิภาพโค้ด Python ด้วยเครื่องมือสร้างโปรไฟล์

การตั้งค่า Google Colab ให้ทำงานเพื่อเพิ่มประสิทธิภาพโค้ด Python ด้วยเครื่องมือสร้างโปรไฟล์ เราเริ่มต้นด้วยการตั้งค่าสภาพแวดล้อม Google Colab หากเราเพิ่งเริ่มใช้ Colab นี่เป็นแพลตฟอร์มบนระบบคลาวด์ที่สำคัญและทรงประสิทธิภาพซึ่งให้สิทธิ์เข้าถึงสมุดบันทึก Jupyter และไลบรารี Python มากมาย เราเข้าถึง Colab โดยไปที่ (https://colab.research.google.com/) และสร้างสมุดบันทึก Python ใหม่

นำเข้าไลบรารีการทำโปรไฟล์

การเพิ่มประสิทธิภาพของเราขึ้นอยู่กับการใช้ไลบรารีการทำโปรไฟล์อย่างเชี่ยวชาญ ไลบรารีที่สำคัญสองแห่งในบริบทนี้คือ cProfile และ line_profiler







นำเข้า ซีโปรไฟล์

นำเข้า line_profiler

ไลบรารี “cProfile” เป็นเครื่องมือ Python ในตัวสำหรับการสร้างโค้ดโปรไฟล์ ในขณะที่ “line_profiler” เป็นแพ็คเกจภายนอกที่ช่วยให้เราสามารถเจาะลึกลงไปอีก โดยวิเคราะห์โค้ดทีละบรรทัด



ในขั้นตอนนี้ เราสร้างสคริปต์ Python ตัวอย่างเพื่อคำนวณลำดับฟีโบนัชชีโดยใช้ฟังก์ชันแบบเรียกซ้ำ มาวิเคราะห์กระบวนการนี้ในเชิงลึกยิ่งขึ้น ลำดับฟีโบนัชชีคือชุดตัวเลขซึ่งแต่ละตัวเลขต่อเนื่องกันคือผลรวมของตัวเลขสองตัวที่อยู่ข้างหน้า โดยปกติจะเริ่มต้นด้วย 0 และ 1 ดังนั้นลำดับจึงดูเหมือน 0, 1, 1, 2, 3, 5, 8, 13, 21 และอื่นๆ เป็นลำดับทางคณิตศาสตร์ที่ใช้กันทั่วไปเป็นตัวอย่างในการเขียนโปรแกรมเนื่องจากลักษณะการเรียกซ้ำ



เรากำหนดฟังก์ชัน Python ที่เรียกว่า 'Fibonacci' ในฟังก์ชัน Fibonacci แบบเรียกซ้ำ ฟังก์ชันนี้รับจำนวนเต็ม 'n' เป็นอาร์กิวเมนต์ ซึ่งแสดงถึงตำแหน่งในลำดับฟีโบนักชีที่เราต้องการคำนวณ เราต้องการค้นหาตัวเลขที่ห้าในลำดับฟีโบนัชชี เช่น ถ้า 'n' เท่ากับ 5





แน่นอน ฟีโบนัชชี ( n ) : :

ต่อไปเราจะสร้างกรณีฐาน กรณีฐานในการเรียกซ้ำคือสถานการณ์ที่ยุติการโทรและส่งกลับค่าที่กำหนดไว้ล่วงหน้า ในลำดับฟีโบนัชชี เมื่อ “n” เป็น 0 หรือ 1 เราก็รู้ผลลัพธ์แล้ว หมายเลขฟีโบนักชีตัวที่ 0 และตัวที่ 1 คือ 0 และ 1 ตามลำดับ

ถ้า n <= 1 : :

กลับ n

คำสั่ง 'if' นี้กำหนดว่า 'n' น้อยกว่าหรือเท่ากับ 1 หากเป็นเช่นนั้น เราจะส่งคืน 'n' เอง เนื่องจากไม่จำเป็นต้องเรียกซ้ำอีก



การคำนวณแบบเรียกซ้ำ

หาก 'n' เกิน 1 เราจะดำเนินการคำนวณแบบเรียกซ้ำต่อไป ในกรณีนี้ เราจำเป็นต้องค้นหาหมายเลขฟีโบนักชีลำดับที่ “n” โดยการรวมตัวเลขฟีโบนักชีลำดับที่ “(n-1)” และ “(n-2)” เราบรรลุเป้าหมายนี้โดยการเรียกซ้ำสองครั้งภายในฟังก์ชัน

อื่น : :

กลับ ฟีโบนัชชี ( ไม่มี - 1 ) + ฟีโบนัชชี ( ไม่มี - 2 )

ในที่นี้ “fibonacci(n – 1)” คำนวณเลขฟีโบนักชีลำดับที่ “(n-1)” และ “fibonacci(n – 2)” คำนวณเลขฟีโบนักชีลำดับที่ “(n-2)” เราเพิ่มค่าทั้งสองนี้เพื่อให้ได้เลขฟีโบนัชชีที่ต้องการที่ตำแหน่ง “n”

โดยสรุป ฟังก์ชัน “ฟีโบนัชชี” นี้จะคำนวณตัวเลขฟีโบนัชชีแบบวนซ้ำโดยแบ่งปัญหาออกเป็นปัญหาย่อยที่เล็กลง มันทำการเรียกซ้ำจนกว่าจะถึงกรณีพื้นฐาน (0 หรือ 1) โดยส่งคืนค่าที่ทราบ สำหรับ 'n' อื่นๆ จะคำนวณหมายเลขฟีโบนัชชีโดยการรวมผลลัพธ์ของการเรียกซ้ำสองครั้งสำหรับ '(n-1)' และ '(n-2)'

แม้ว่าการดำเนินการนี้จะคำนวณตัวเลขฟีโบนัชชีได้อย่างตรงไปตรงมา แต่ก็ไม่ได้มีประสิทธิภาพมากที่สุด ในขั้นตอนต่อๆ ไป เราจะใช้เครื่องมือสร้างโปรไฟล์เพื่อระบุและเพิ่มประสิทธิภาพข้อจำกัดด้านประสิทธิภาพเพื่อเวลาดำเนินการที่ดีขึ้น

การสร้างโปรไฟล์โค้ดด้วย CProfile

ตอนนี้ เราสร้างโปรไฟล์ฟังก์ชัน “fibonacci” ของเราโดยใช้ “cProfile” แบบฝึกหัดการทำโปรไฟล์นี้ให้ข้อมูลเชิงลึกเกี่ยวกับเวลาที่เรียกใช้ฟังก์ชันแต่ละครั้ง

ซีโปรไฟล์ = ซีโปรไฟล์. ประวัติโดยย่อ ( )

ซีโปรไฟล์ เปิดใช้งาน ( )

ผลลัพธ์ = ฟีโบนัชชี ( 30 )

ซีโปรไฟล์ ปิดการใช้งาน ( )

ซีโปรไฟล์ print_stats ( เรียงลำดับ = 'สะสม' )

ในส่วนนี้ เราจะเริ่มต้นออบเจ็กต์ “cProfile” เปิดใช้งานการสร้างโปรไฟล์ ร้องขอฟังก์ชัน “fibonacci” ด้วย “n=30” ปิดใช้งานการสร้างโปรไฟล์ และแสดงสถิติที่จัดเรียงตามเวลาสะสม การทำโปรไฟล์เบื้องต้นนี้ทำให้เราเห็นภาพรวมในระดับสูงว่าฟังก์ชันใดใช้เวลามากที่สุด

! pip ติดตั้ง line_profiler

นำเข้า ซีโปรไฟล์

นำเข้า line_profiler

แน่นอน ฟีโบนัชชี ( n ) : :

ถ้า n <= 1 : :

กลับ n

อื่น : :

กลับ ฟีโบนัชชี ( ไม่มี - 1 ) + ฟีโบนัชชี ( ไม่มี - 2 )

ซีโปรไฟล์ = ซีโปรไฟล์. ประวัติโดยย่อ ( )

ซีโปรไฟล์ เปิดใช้งาน ( )

ผลลัพธ์ = ฟีโบนัชชี ( 30 )

ซีโปรไฟล์ ปิดการใช้งาน ( )

ซีโปรไฟล์ print_stats ( เรียงลำดับ = 'สะสม' )

หากต้องการโปรไฟล์โค้ดทีละบรรทัดด้วย line_profiler เพื่อการวิเคราะห์ที่ละเอียดยิ่งขึ้น เราใช้ 'line_profiler' เพื่อแบ่งส่วนโค้ดของเราทีละบรรทัด ก่อนที่จะใช้ 'line_profiler' เราต้องติดตั้งแพ็กเกจในพื้นที่เก็บข้อมูล Colab

! pip ติดตั้ง line_profiler

ตอนนี้เรามี 'line_profiler' พร้อมแล้ว เราก็สามารถนำมันไปใช้กับฟังก์ชัน 'fibonacci' ของเราได้:

%load_ext line_profiler

แน่นอน ฟีโบนัชชี ( n ) : :

ถ้า n <= 1 : :

กลับ n

อื่น : :

กลับ ฟีโบนัชชี ( ไม่มี - 1 ) + ฟีโบนัชชี ( ไม่มี - 2 )

%lprun -f ฟีโบนัชชี ฟีโบนัชชี ( 30 )

ตัวอย่างนี้เริ่มต้นด้วยการโหลดส่วนขยาย “line_profiler” กำหนดฟังก์ชัน “fibonacci” ของเรา และสุดท้ายใช้ “%lprun” เพื่อสร้างโปรไฟล์ฟังก์ชัน “fibonacci” ด้วย “n=30” โดยนำเสนอการแบ่งส่วนเวลาดำเนินการทีละบรรทัด ทำให้ชัดเจนอย่างชัดเจนว่าโค้ดของเราใช้ทรัพยากรไปที่จุดใด

หลังจากเรียกใช้เครื่องมือสร้างโปรไฟล์เพื่อวิเคราะห์ผลลัพธ์ จะมีการนำเสนอสถิติมากมายที่แสดงลักษณะการทำงานของโค้ดของเรา สถิติเหล่านี้เกี่ยวข้องกับเวลาทั้งหมดที่ใช้ไปในแต่ละฟังก์ชันและระยะเวลาของโค้ดแต่ละบรรทัด ตัวอย่างเช่น เราอาจแยกแยะได้ว่าฟังก์ชัน Fibonacci ใช้เวลาเพิ่มขึ้นเล็กน้อยในการคำนวณค่าที่เหมือนกันหลายครั้ง นี่คือการคำนวณที่ซ้ำซ้อนและเป็นพื้นที่ที่ชัดเจนที่สามารถนำการปรับให้เหมาะสมมาใช้ได้ ไม่ว่าจะผ่านการท่องจำหรือโดยการใช้อัลกอริธึมวนซ้ำ

ตอนนี้ เราทำการปรับให้เหมาะสมโดยระบุการปรับให้เหมาะสมที่เป็นไปได้ในฟังก์ชัน Fibonacci ของเรา เราสังเกตเห็นว่าฟังก์ชันจะคำนวณหมายเลข Fibonacci ที่เหมือนกันซ้ำหลายครั้ง ส่งผลให้มีความซ้ำซ้อนโดยไม่จำเป็นและเวลาดำเนินการช้าลง

เพื่อเพิ่มประสิทธิภาพนี้ เราใช้การบันทึกช่วยจำ การจดบันทึกเป็นเทคนิคการปรับให้เหมาะสมที่เกี่ยวข้องกับการจัดเก็บผลลัพธ์ที่คำนวณไว้ก่อนหน้านี้ (ในกรณีนี้คือตัวเลขฟีโบนัชชี) และนำมาใช้ใหม่เมื่อจำเป็น แทนที่จะคำนวณใหม่ ซึ่งจะช่วยลดการคำนวณซ้ำซ้อนและปรับปรุงประสิทธิภาพ โดยเฉพาะฟังก์ชันที่เกิดซ้ำ เช่น ลำดับฟีโบนักชี

หากต้องการใช้บันทึกช่วยจำในฟังก์ชัน Fibonacci ของเรา เราจะเขียนโค้ดต่อไปนี้:

# พจนานุกรมเพื่อจัดเก็บหมายเลขฟีโบนักชีที่คำนวณได้
fib_cache = { }
แน่นอน ฟีโบนัชชี ( n ) : :
ถ้า n <= 1 : :
กลับ n
# ตรวจสอบว่าผลลัพธ์ถูกแคชไว้แล้วหรือไม่
ถ้า n ใน fib_cache:
กลับ fib_cache [ n ]
อื่น : :
# คำนวณและแคชผลลัพธ์
fib_cache [ n ] = ฟีโบนัชชี ( ไม่มี - 1 ) + ฟีโบนัชชี ( ไม่มี - 2 )
กลับ fib_cache [ n ] ,

ในฟังก์ชัน “fibonacci” เวอร์ชันปรับปรุงนี้ เราขอแนะนำพจนานุกรม “fib_cache” เพื่อจัดเก็บตัวเลข Fibonacci ที่คำนวณไว้ก่อนหน้านี้ ก่อนที่จะคำนวณหมายเลข Fibonacci เราจะตรวจสอบว่าหมายเลขดังกล่าวอยู่ในแคชแล้วหรือไม่ หากเป็นเช่นนั้น เราจะส่งคืนผลลัพธ์ที่แคชไว้ ในกรณีอื่น เราจะคำนวณ เก็บไว้ในแคช แล้วส่งคืน

ทำซ้ำการสร้างโปรไฟล์และการเพิ่มประสิทธิภาพ

หลังจากใช้การปรับให้เหมาะสมแล้ว (การจดบันทึกในกรณีของเรา) จำเป็นอย่างยิ่งที่จะต้องทำซ้ำกระบวนการโปรไฟล์เพื่อทราบผลกระทบของการเปลี่ยนแปลงของเรา และให้แน่ใจว่าเราได้ปรับปรุงประสิทธิภาพของโค้ดแล้ว

การทำโปรไฟล์หลังจากการเพิ่มประสิทธิภาพ

เราสามารถใช้เครื่องมือสร้างโปรไฟล์เดียวกัน “cProfile” และ “line_profiler” เพื่อสร้างโปรไฟล์ฟังก์ชัน Fibonacci ที่ปรับให้เหมาะสมที่สุด ด้วยการเปรียบเทียบผลลัพธ์การทำโปรไฟล์ใหม่กับผลลัพธ์ก่อนหน้า เราสามารถวัดประสิทธิภาพของการปรับให้เหมาะสมของเราได้

ต่อไปนี้คือวิธีที่เราสามารถสร้างโปรไฟล์ฟังก์ชัน “fibonacci” ที่ปรับให้เหมาะสมโดยใช้ “cProfile”:

ซีโปรไฟล์ = ซีโปรไฟล์. ประวัติโดยย่อ ( )

ซีโปรไฟล์ เปิดใช้งาน ( )

ผลลัพธ์ = ฟีโบนัชชี ( 30 )

ซีโปรไฟล์ ปิดการใช้งาน ( )

ซีโปรไฟล์ print_stats ( เรียงลำดับ = 'สะสม' )

การใช้ 'line_profiler' เราจะทำโปรไฟล์ทีละบรรทัด:

%lprun -f ฟีโบนัชชี ฟีโบนัชชี ( 30 )

รหัส:

# พจนานุกรมเพื่อจัดเก็บหมายเลขฟีโบนักชีที่คำนวณได้
fib_cache = { }

แน่นอน ฟีโบนัชชี ( n ) : :
ถ้า n <= 1 : :
กลับ n
# ตรวจสอบว่าผลลัพธ์ถูกแคชไว้แล้วหรือไม่
ถ้า n ใน fib_cache:
กลับ fib_cache [ n ]
อื่น : :
# คำนวณและแคชผลลัพธ์
fib_cache [ n ] = ฟีโบนัชชี ( ไม่มี - 1 ) + ฟีโบนัชชี ( ไม่มี - 2 )
กลับ fib_cache [ n ]
ซีโปรไฟล์ = ซีโปรไฟล์. ประวัติโดยย่อ ( )
ซีโปรไฟล์ เปิดใช้งาน ( )

ผลลัพธ์ = ฟีโบนัชชี ( 30 )

ซีโปรไฟล์ ปิดการใช้งาน ( )
ซีโปรไฟล์ print_stats ( เรียงลำดับ = 'สะสม' )
%lprun -f ฟีโบนัชชี ฟีโบนัชชี ( 30 )

เพื่อวิเคราะห์ผลลัพธ์การทำโปรไฟล์หลังการเพิ่มประสิทธิภาพ เวลาดำเนินการจะลดลงอย่างมาก โดยเฉพาะอย่างยิ่งสำหรับค่า 'n' ที่มีขนาดใหญ่ เนื่องจากการจดบันทึก เราสังเกตเห็นว่าฟังก์ชันนี้ใช้เวลาในการคำนวณตัวเลขฟีโบนัชชีใหม่น้อยลงมาก

ขั้นตอนเหล่านี้มีความสำคัญในกระบวนการปรับให้เหมาะสม การเพิ่มประสิทธิภาพเกี่ยวข้องกับการเปลี่ยนแปลงโค้ดของเราอย่างมีข้อมูลโดยยึดตามข้อสังเกตที่ได้รับจากการทำโปรไฟล์ ในขณะที่การทำโปรไฟล์ซ้ำทำให้มั่นใจได้ว่าการปรับให้เหมาะสมของเราจะให้ผลการปรับปรุงประสิทธิภาพที่คาดหวัง ด้วยการทำโปรไฟล์ซ้ำ การเพิ่มประสิทธิภาพ และการตรวจสอบ เราสามารถปรับแต่งโค้ด Python ของเราเพื่อมอบประสิทธิภาพที่ดีขึ้น และปรับปรุงประสบการณ์ผู้ใช้แอปพลิเคชันของเรา

บทสรุป

ในบทความนี้ เราได้พูดถึงตัวอย่างที่เราปรับโค้ด Python ให้เหมาะสมโดยใช้เครื่องมือสร้างโปรไฟล์ภายในสภาพแวดล้อม Google Colab เราเริ่มต้นตัวอย่างด้วยการตั้งค่า นำเข้าไลบรารีโปรไฟล์ที่จำเป็น เขียนโค้ดตัวอย่าง สร้างโปรไฟล์โดยใช้ทั้ง “cProfile” และ “line_profiler” คำนวณผลลัพธ์ ใช้การปรับให้เหมาะสม และปรับปรุงประสิทธิภาพของโค้ดซ้ำๆ