ความแตกต่างด้านประสิทธิภาพของสวิตช์ทางเลือกใน Python

ฉันได้อ่านบทความบางส่วนเกี่ยวกับทางเลือกอื่นของคำสั่ง switch ใน Python แล้ว ส่วนใหญ่ใช้ dicts แทน if's และ elif's จำนวนมาก อย่างไรก็ตามไม่มีใครตอบคำถามได้จริงๆ: มีใครมีประสิทธิภาพหรือประสิทธิผลดีกว่านี้หรือไม่? ฉันได้อ่านข้อโต้แย้งบางประการที่ if's และ elifs จะต้องตรวจสอบแต่ละคำสั่ง และทำให้ไม่มีประสิทธิภาพเมื่อใช้ ifs และ elif จำนวนมาก อย่างไรก็ตามการใช้ dicts จะช่วยได้ แต่สุดท้ายคุณต้องสร้างโมดูลใหม่เพื่อเรียกซึ่งจะยกเลิกประสิทธิภาพที่ได้รับต่อไป ความแตกต่างเพียงอย่างเดียวในตอนท้ายคือสามารถอ่านได้

ใครสามารถแสดงความคิดเห็นเกี่ยวกับเรื่องนี้ ในระยะยาวมีความแตกต่างจริง ๆ หรือไม่? มีใครใช้ทางเลือกอื่นเป็นประจำบ้างไหม? เหตุผลเดียวที่ฉันถามก็คือเพราะฉันจะต้องได้ 30-40 elif/if's และอาจจะมากกว่านั้นในอนาคต การป้อนข้อมูลใด ๆ ที่ชื่นชม ขอบคุณ.


person Chuck    schedule 07.11.2009    source แหล่งที่มา
comment
มีข้อเสนอแนะที่ดีเยี่ยมพร้อมการอภิปรายเกี่ยวกับประสิทธิภาพที่ stackoverflow.com/questions/60208/   -  person Greg Hewgill    schedule 07.11.2009
comment
กลายเป็นไม่มีประสิทธิภาพด้วย ifs และ elif จำนวนมาก คุณจะต้องแสดงหลักฐานที่แท้จริงว่าสิ่งนี้สามารถวัดได้จริงก่อนที่จะเสียเวลากับสิ่งนี้ นอกจากนี้ ค่าใช้จ่ายในการบำรุงรักษามักเป็นส่วนที่แพงที่สุดของซอฟต์แวร์ ปรับเวลาของโปรแกรมเมอร์ในอนาคตให้เหมาะสม   -  person S.Lott    schedule 07.11.2009
comment
ฉันทำการทดสอบบางอย่างเกี่ยวกับเรื่องนี้ ฉันกำลังเขียนล่ามและการใช้คำสั่ง if ขนาดใหญ่ในการดำเนินการตามคำสั่งเป็นหนึ่งในสองปัญหาคอขวดที่สำคัญ   -  person mdm    schedule 05.12.2010


คำตอบ (6)


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

ตามที่คนอื่นๆ แนะนำไว้ ให้ลอง timeit ทดลองโดยใช้เกณฑ์มาตรฐานเล็กๆ น้อยๆ ของทางเลือกอื่นๆ คำทำนายของฉัน: ด้วยความเป็นไปได้ไม่กี่สิบอย่างในการเล่น อย่างที่คุณพูดถึง คุณจะตบหน้าผากของคุณเกี่ยวกับการพิจารณาอะไรก็ตาม แต่ เป็นคำบอกเล่าของ callables!-)

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

person Alex Martelli    schedule 07.11.2009

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

person Eli Bendersky    schedule 07.11.2009
comment
ไม่ใช่คำตอบสำหรับคำถามจริงๆ มีแอปพลิเคชั่นมากมายที่ไม่อาจหลีกเลี่ยงการแยกหลายทางและประสิทธิภาพของมันเป็นสิ่งสำคัญ (เช่น ล่าม) - person mdm; 05.12.2010

สำหรับคำถามด้านประสิทธิภาพ/การทำโปรไฟล์ คำตอบที่ถูกต้องคือ "ทดสอบแต่ละกรณีด้วยตัวคุณเองตามความต้องการเฉพาะของคุณ"

เครื่องมือที่ยอดเยี่ยมอย่างหนึ่งสำหรับสิ่งนี้คือ timeit ซึ่งคุณสามารถเรียนรู้เกี่ยวกับ ในเอกสาร python

โดยทั่วไป ฉันไม่พบปัญหาด้านประสิทธิภาพที่เกี่ยวข้องกับการใช้พจนานุกรมแทนคำสั่งภาษาอื่น switch ฉันเดาว่าการเปรียบเทียบประสิทธิภาพจะขึ้นอยู่กับจำนวนทางเลือกอื่น ใครจะรู้ อาจมีจุดเปลี่ยนที่คนๆ หนึ่งเก่งกว่าอีกคนหนึ่ง

หากคุณ (หรือใครก็ตาม) ทดสอบ โปรดโพสต์ผลลัพธ์ของคุณได้เลย

person Gabriel Hurley    schedule 07.11.2009

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

dicts ถูกใช้อย่างแพร่หลายใน Python CPython dicts เป็นการใช้งาน hashtable ที่มีประสิทธิภาพและแข็งแกร่งอย่างเหลือเชื่อ การค้นหาคือ O(1) ซึ่งตรงข้ามกับการเคลื่อนที่ผ่านห่วงโซ่เอลิฟ ซึ่งก็คือ O(n) (30-40 อาจไม่มีคุณสมบัติเพียงพอสำหรับเรื่องนี้อยู่ดี) ฉันไม่แน่ใจว่าคุณหมายถึงอะไรเกี่ยวกับการสร้างโมดูลใหม่ที่จะโทร แต่การใช้ dicts นั้นสามารถปรับขนาดได้และง่ายมาก

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

person Mike Graham    schedule 07.11.2009

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

person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x    schedule 07.11.2009

ฉันใช้การวัดประสิทธิภาพบางส่วน (ดูที่นี่) การใช้รายการพอยน์เตอร์ฟังก์ชันจะเร็วที่สุด หากคีย์ของคุณเป็นจำนวนเต็มตามลำดับ สำหรับกรณีทั่วไป: Alex Martelli พูดถูก ส่วนพจนานุกรมนั้นเร็วที่สุด

person mdm    schedule 09.12.2010