Python เป็นหนึ่งในภาษาที่นักเขียนโค้ดชอบสำหรับการแข่งขันเขียนโปรแกรมส่วนใหญ่ ส่วนใหญ่ของปัญหาสามารถคำนวณได้ในกรอบเวลาที่เหมาะสมโดยใช้ Python
สำหรับปัญหาบางอย่างที่ซับซ้อน การเขียนโค้ด Python ที่พอสมควรเร็วพอ บางครั้งเป็นความท้าทาย ด้านล่างคือโครงสร้างโค้ด Pythonic บางอย่างที่ช่วยปรับปรุงประสิทธิภาพของโค้ดในการเขียนโค้ดแข่งขัน −
1. การต่อสตริง (Strings concatenation): อย่าใช้โครงสร้างด้านล่าง
str1 = "" some_list = ["Welcome ", "To ", "Tutorialspoint "] for x in some_list: str1 += x print(str1)
วิธีข้างต้นให้ overhead เวลามาก มากกว่านั้น ลองใช้วิธีนี้ (join method) −
str1 = "" some_list = ["Welcome ", "To ", "Tutorialspoint "] print(str1.join(some_list))
2. ฟังก์ชัน Map
โดยทั่วไป คุณจะมีอินพุตในการเขียนโค้ดแข่งขัน ประมาณนี้ −
1234567
เพื่อให้ได้เป็นลิสต์ของตัวเลขเพียงแค่
list(map(int, input().split()))
ใช้ฟังก์ชัน input() เสมอไม่ว่าจะเป็นประเภทอินพุตอะไร แล้วแปลงด้วยฟังก์ชัน map
>>> list(map(int, input("enter numbers:").split())) enter numbers:1 2 3 4 5 6 7 [1, 2, 3, 4, 5, 6, 7] >>>
ฟังก์ชัน map เป็นหนึ่งในฟังก์ชัน built-in ที่สวยงามของ Python ซึ่งมาช่วยได้หลายครั้ง คุ้มค่าที่จะรู้จัก
3. โมดูล Collections
ในกรณีที่เราต้องการลบรายการซ้ำจากลิสต์ ในขณะที่ภาษาอื่นๆ เช่น Java คุณอาจต้องใช้ HashMap หรือวิธีแปลกๆ อื่นๆ แต่ใน Python มันง่ายแค่
>>> print(list(set([1,2,3,4,3,4,5,6]))) [1, 2, 3, 4, 5, 6]
นอกจากนี้ ให้ระวังในการใช้ extend() และ append() ในลิสต์ ขณะรวมสองลิสต์หรือมากกว่า
>>> a = [1, 2, 3,4] # list 1 >>> b = [5, 6, 7] # list 2 >>> a.extend(b)#ให้ลิสต์เดียว >>> a [1, 2, 3, 4, 5, 6, 7] >>> a.append(b) # ให้ลิสต์ของลิสต์ >>> a [1, 2, 3, 4, [5, 6, 7]]
4. โครงสร้างภาษา (Language constructs)
เขียนโค้ดภายในฟังก์ชันดีกว่า แม้ Python จะรองรับโค้ด procedural
def main(): for i in range(2**3): print(x) main()
ดีกว่า
for x in range(2**3): print(x)
การเก็บตัวแปร local เร็วกว่า globals เนื่องจากการ implement ของ Cpython ด้านล่าง
5. ใช้ Standard Library:
ควรใช้ built-in functions และแพ็กเกจ standard library มากที่สุด แทนที่จะ −
newlist = [] for x in somelist: newlist.append(myfunc(x))
ใช้นี้ −
newlist = map(myfunc, somelist)
เช่นกัน ลองใช้ itertools (standard library) เพราะพวกมันเร็วมากสำหรับงานทั่วไป ตัวอย่างเช่น คุณสามารถได้ permutation สำหรับลูปด้วยโค้ดเพียงไม่กี่บรรทัด
>>> import itertools >>> iter = itertools.permutations(["a","b","c"]) >>> list(iter) [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
6. Generators
Generators เป็นโครงสร้างที่ยอดเยี่ยมในการลดทั้ง memory footprint และ average time complexity ของโค้ดที่คุณเขียน
def fib(): a, b = 0, 1 while 1: yield a a, b = b, a+b