Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Tricks สำหรับการเขียนโค้ดแข่งขัน (Competitive Coding)


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