สมมติว่าผมมีคำสั่งด้วยif
return
จากมุมมองประสิทธิภาพฉันควรใช้
if(A > B):
return A+1
return A-1
หรือ
if(A > B):
return A+1
else:
return A-1
ฉันควรจะเลือกภาษาใดภาษาหนึ่งเมื่อใช้ภาษาที่รวบรวม (C) หรือภาษาสคริปต์ (Python)
สมมติว่าผมมีคำสั่งด้วยif
return
จากมุมมองประสิทธิภาพฉันควรใช้
if(A > B):
return A+1
return A-1
หรือ
if(A > B):
return A+1
else:
return A-1
ฉันควรจะเลือกภาษาใดภาษาหนึ่งเมื่อใช้ภาษาที่รวบรวม (C) หรือภาษาสคริปต์ (Python)
คำตอบ:
เนื่องจากreturn
คำสั่งยุติการดำเนินการของฟังก์ชั่นปัจจุบันทั้งสองรูปแบบจะเทียบเท่า (แม้ว่ารูปแบบที่สองสามารถอ่านได้มากกว่าเนื้อหาแรก)
ประสิทธิภาพของทั้งสองรูปแบบเทียบเคียงได้รหัสเครื่องต้นแบบจะต้องทำการกระโดดหากif
เงื่อนไขเป็นเท็จอยู่ดี
โปรดทราบว่า Python สนับสนุนไวยากรณ์ที่ช่วยให้คุณใช้return
คำสั่งเดียวในกรณีของคุณ:
return A+1 if A > B else A-1
return (A>B)?A+1:A-1;
อย่างไรก็ตามไม่มีการเพิ่มประสิทธิภาพอย่างแน่นอนจากการเขียนโค้ดเช่นนี้ สิ่งที่เราทำได้คือทำให้โค้ดสับสนอ่านไม่ได้และในบางกรณีมีความเสี่ยงที่จะโปรโมตประเภทโดยนัย
<
เป็นการปฏิบัติที่ไม่ดีเพราะ-1 < 1u
ให้ผลลัพธ์ที่ไม่คาดคิด
-1 < 1u
ที่ฉันสงสัยพวกเขาจะสังเกตเห็นข้อผิดพลาดได้อย่างง่ายดาย ผู้คนจำนวนมากจะเขียนโค้ดบางเวอร์ชันที่ฉันโพสต์ ฉันเห็นข้อบกพร่องดังกล่าวบ่อยเกินไปในรหัสการผลิตเพื่อเชื่อถือตัวดำเนินการ:: เช่นเดียวกับกฎทั่วไปหากภาษาให้สองวิธีที่แตกต่างกันในการทำสิ่งเดียวกันให้ใช้วิธีใดวิธีหนึ่งเท่านั้นอย่าสุ่มเลือกทั้งสองแบบขึ้นอยู่กับอารมณ์ของคุณ
จากคู่มือสไตล์ของ Chromium :
อย่าใช้อย่างอื่นหลังจากส่งคืน:
# Bad
if (foo)
return 1
else
return 2
# Good
if (foo)
return 1
return 2
return 1 if foo else 2
if-else-return
สาขาแทบจะไม่เท่ากัน (ถ้าเป็นเช่นนั้นคุณควรทำการปรับโครงสร้างต่อไปไม่ว่าจะใช้switch
โครงสร้างหรือ Python ให้ระบุ dict / ใช้ callable / etc) ดังนั้นเกือบทุกif-else-return
กรณีของข้อระวังและผู้ที่มีเสมอทดสอบ (เยาะเย้ยการแสดงออกผ่านการทดสอบ) else
โดยไม่ต้อง
เกี่ยวกับรูปแบบการเข้ารหัส:
มาตรฐานการเข้ารหัสส่วนใหญ่ไม่ว่าภาษาใดจะห้ามใช้คำสั่งคืนหลายคำสั่งจากฟังก์ชั่นเดียวว่าเป็นการฝึกฝนที่ไม่ดี
(แม้ว่าโดยส่วนตัวแล้วฉันจะบอกว่ามีหลายกรณีที่ข้อความสั่งคืนหลายรายการมีเหตุผล: ข้อความ / ตัวแยกวิเคราะห์โปรโตคอลข้อมูลฟังก์ชั่นที่มีการจัดการข้อผิดพลาดมากมาย ฯลฯ )
ฉันทามติจากมาตรฐานการเข้ารหัสของอุตสาหกรรมเหล่านั้นคือนิพจน์ควรเขียนเป็น:
int result;
if(A > B)
{
result = A+1;
}
else
{
result = A-1;
}
return result;
เกี่ยวกับประสิทธิภาพ:
ตัวอย่างข้างต้นและสองตัวอย่างในคำถามล้วนมีความเท่าเทียมกันอย่างสมบูรณ์ในแง่ของประสิทธิภาพ รหัสเครื่องในกรณีเหล่านี้ทั้งหมดต้องเปรียบเทียบ A> B จากนั้นแยกสาขาเป็นการคำนวณ A + 1 หรือ A-1 จากนั้นจัดเก็บผลลัพธ์ของการลงทะเบียน CPU หรือในสแต็ก
แก้ไข:
แหล่งที่มา:
return
ที่ใดก็ตามที่มันเกิดขึ้นต้องมีความชัดเจนเป็นวิธีที่เป็นสำนวนที่จะทำมันในหลาม
ด้วยคอมไพเลอร์ที่สมเหตุสมผลคุณควรสังเกตความแตกต่าง ควรจะคอมไพล์รหัสเครื่องที่เหมือนกันเนื่องจากเทียบเท่า
นี่เป็นคำถามของรูปแบบ (หรือการตั้งค่า) เนื่องจากล่ามไม่สนใจ โดยส่วนตัวแล้วฉันจะพยายามไม่สร้างข้อความสั่งสุดท้ายของฟังก์ชันที่คืนค่าในระดับเยื้องที่ไม่ใช่ฟังก์ชันพื้นฐาน สิ่งอื่นในตัวอย่าง 1 ปิดบังหากเพียงเล็กน้อยซึ่งจุดสิ้นสุดของฟังก์ชันคือ
โดยการตั้งค่าฉันใช้:
return A+1 if (A > B) else A-1
เนื่องจากเป็นไปตามข้อตกลงที่ดีของการมีคำสั่งส่งคืนเดียวเป็นคำสั่งสุดท้ายในฟังก์ชั่น (ดังที่ได้กล่าวไว้แล้ว) และกระบวนทัศน์การเขียนโปรแกรมที่ใช้งานได้ดีในการหลีกเลี่ยงผลลัพธ์กลางที่จำเป็น
สำหรับฟังก์ชั่นที่ซับซ้อนมากขึ้นฉันชอบที่จะแบ่งฟังก์ชั่นออกเป็นฟังก์ชั่นย่อยหลาย ๆ อันเพื่อหลีกเลี่ยงการส่งคืนก่อนกำหนดหากเป็นไปได้ มิฉะนั้นฉันจะกลับไปใช้ตัวแปรสไตล์ที่จำเป็นที่เรียกว่า rval ฉันพยายามที่จะไม่ใช้คำสั่ง return หลายคำยกเว้นว่าฟังก์ชั่นนั้นน่ารำคาญหรือประโยคคำสั่ง return ก่อนที่จะสิ้นสุดนั้นเป็นผลมาจากข้อผิดพลาด การกลับมาก่อนกำหนดเน้นข้อเท็จจริงที่ว่าคุณไม่สามารถดำเนินการต่อไปได้ สำหรับฟังก์ชั่นที่ซับซ้อนที่ได้รับการออกแบบให้แยกออกเป็นหลายฟังก์ชั่นย่อยฉันพยายามที่จะเขียนโค้ดมันเป็นข้อความสั่งเคส (ขับเคลื่อนโดย dict เป็นต้น)
ผู้โพสต์บางคนพูดถึงความเร็วในการทำงาน ความเร็วในการใช้งานเป็นสิ่งรองสำหรับฉันเพราะถ้าคุณต้องการความเร็วในการดำเนินการ Python ไม่ใช่ภาษาที่ดีที่สุดในการใช้งาน ฉันใช้ Python เป็นประสิทธิภาพในการเขียนโค้ด (เช่นการเขียนรหัสข้อผิดพลาดฟรี) ที่สำคัญกับฉัน
var n = 1 if (A > B) else -1
return A+n
ฉันหลีกเลี่ยงการelse
บล็อกส่วนตัวเมื่อเป็นไปได้ ดูแคมเปญต่อต้านถ้า
นอกจากนี้พวกเขาไม่คิดค่าใช้จ่าย 'พิเศษ' สำหรับสายคุณรู้ว่า: p
"ง่ายดีกว่าซับซ้อน" & "การอ่านเป็นกษัตริย์"
delta = 1 if (A > B) else -1
return A + delta
dict
s เพื่อหลีกเลี่ยง diffs เป็นความคิดที่ไม่ดีมาก ๆ
เวอร์ชั่น A นั้นง่ายกว่าและนั่นเป็นสาเหตุที่ฉันจะใช้มัน
และถ้าคุณเปิดคำเตือนคอมไพเลอร์ทั้งหมดใน Java คุณจะได้รับคำเตือนเกี่ยวกับเวอร์ชันที่สองเพราะมันไม่เจาะจงและเปลี่ยนความซับซ้อนของรหัส
ฉันรู้ว่าคำถามถูกติดแท็กไพ ธ อน แต่มันพูดถึงภาษาไดนามิกดังนั้นคิดว่าฉันควรพูดถึงว่าในทับทิมถ้าคำสั่งที่จริงมีประเภทกลับเพื่อให้คุณสามารถทำสิ่งที่ชอบ
def foo
rv = if (A > B)
A+1
else
A-1
end
return rv
end
หรือเพราะมันยังมีผลตอบแทนโดยปริยายเพียง
def foo
if (A>B)
A+1
else
A-1
end
end
ซึ่งได้รับการแก้ไขปัญหาสไตล์ที่ไม่มีผลตอบแทนหลายอย่างค่อนข้าง