แม้ว่าเราทุกคนจะทราบดีว่า python นั้นไม่ได้เร็วหรือมีประสิทธิภาพเท่ากับภาษาอื่นๆ อย่างไรก็ตาม มีบริษัทขนาดใหญ่หลายแห่งที่แสดงให้เราเห็นว่าโค้ด python สามารถรองรับเวิร์กโหลดที่ใหญ่กว่าได้มาก ซึ่งแสดงให้เห็นว่าไม่ได้ช้าขนาดนั้น ในส่วนนี้ เราจะมาดูเคล็ดลับบางอย่างที่ควรทราบเพื่อให้โปรแกรมหลามที่ถูกต้องทำงานได้เร็วขึ้นและมีประสิทธิภาพมากขึ้น
เคล็ดลับที่ 1:ลองใช้ฟังก์ชันในตัว
แม้ว่าเราจะสามารถเขียนโค้ดที่มีประสิทธิภาพใน python ได้ แต่ก็ยากที่จะเอาชนะฟังก์ชันในตัว (ซึ่งเขียนด้วยภาษา C) ภาพด้านล่างแสดงรายการฟังก์ชันในตัวของ python
เคล็ดลับ 2:ใช้ python หลายการกำหนดเพื่อสลับตัวแปร
>>> #Instead of using >>> x, y = y, x >>> #Use this - which is much faster >>> temp = x >>> x = y >>> y = temp
เคล็ดลับที่ 3:หลีกเลี่ยงตัวแปรส่วนกลางและใช้ตัวแปรภายในหากเป็นไปได้
Python นั้นเร็วกว่าเมื่อดึงตัวแปรในเครื่องมากกว่าการดึงตัวแปรส่วนกลาง นั่นคือ หลีกเลี่ยงตัวแปรส่วนกลางถ้าเป็นไปได้
เคล็ดลับ 4:ใช้ “in” ในทุกที่ที่ทำได้
ในการตรวจสอบความเป็นสมาชิกโดยทั่วไป ให้ใช้คีย์เวิร์ด "ใน" สะอาดและรวดเร็ว
for key in sequence: print ("Hello ", key)
เคล็ดลับ 5:ใช้ “while 1” สำหรับวนซ้ำที่ไม่สิ้นสุด
มีบางครั้งที่เราต้องรัน infinite loop ในโปรแกรมของเรา (เช่น ซ็อกเก็ตการฟัง) แม้ว่า “ในขณะที่ True” จะดำเนินการแบบเดียวกัน “ในขณะที่ 1” เป็นการกระโดดครั้งเดียว
>>> while 1: # do something, faster with while 1 >>> while True: #do something, perform same operation but slower than then previous one
เคล็ดลับ 6:ใช้ความเข้าใจรายการ
เราสามารถใช้ list comprehension จาก python 2.0 เพื่อแทนที่บล็อก "for" และ "while" จำนวนมาก ความเข้าใจรายการนั้นเร็วกว่ามาก เนื่องจากได้รับการปรับให้เหมาะสมสำหรับล่าม python เพื่อระบุรูปแบบที่คาดเดาได้ระหว่างการวนซ้ำ สามารถอ่านได้ง่ายกว่าและในกรณีส่วนใหญ่จะบันทึกตัวแปรพิเศษไว้หนึ่งตัวสำหรับการนับ
ตัวอย่างเช่น การหาเลขคู่ระหว่าง 1 ถึง 25 ด้วยบรรทัดเดียว:
>>> #Using list comprehension - good way >>> print([i for i in range (25) if i%2 == 0]) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24] >>> # Another way - not so efficient way i = 0 evens = [] while i< 25: if i%2 == 0: evens.append(i) i += 1 print(evens) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]
เคล็ดลับ 7:การใช้โปรแกรมสร้างหลามเพื่อให้ได้ค่าตามความต้องการ
การใช้ตัวสร้างหลามช่วยประหยัดหน่วยความจำและปรับปรุงประสิทธิภาพ ในกรณีที่คุณกำลังสตรีมวิดีโอ คุณสามารถส่งจำนวนไบต์ได้ แต่ไม่ใช่ทั้งสตรีม
>>> chunkBytes = (1000 * i for i in range(1000)) >>> next(chunkBytes) 0 >>> next(chunkBytes) 1000 >>> next(chunkBytes) 2000 >>> next(chunkBytes) 3000 >>>
เคล็ดลับ 8:การใช้โมดูล itertools
โมดูล itertools มีประโยชน์มากและมีประสิทธิภาพสำหรับการทำซ้ำและการรวมกัน
เพื่อสร้างการเปลี่ยนแปลงทั้งหมดสำหรับรายการ [1, 2, 3, 4, 5] ในโค้ดหลามสองสามบรรทัด
>>> import itertools >>> iter1 = itertools.permutations([1, 2, 3,4]) >>> list(iter1) [(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]
เคล็ดลับที่ 9:การใช้โมดูล bisect เพื่อจัดระเบียบรายการ
เป็นการใช้งานการค้นหาแบบไบนารีฟรีและเครื่องมือแทรกที่รวดเร็วสำหรับการเรียงลำดับ
>>> import bisect >>> bisect.insort(list, element)
เราได้แทรกองค์ประกอบลงในรายการของเราแล้ว และตอนนี้เราไม่จำเป็นต้องเรียก sort() อีกครั้งเพื่อจัดเรียงคอนเทนเนอร์ ซึ่งอาจมีราคาแพงมากในลำดับที่ยาว
เคล็ดลับ 10:การใช้พจนานุกรมและตั้งค่าเพื่อทดสอบการเป็นสมาชิก
เนื่องจากพจนานุกรมและชุดถูกใช้งานโดยใช้ตารางแฮช ให้ตรวจสอบว่าองค์ประกอบนั้นมีอยู่ในพจนานุกรมหรือชุดใน python นั้นเร็วมาก บางครั้งการค้นหาก็เร็วเท่ากับ O(1)
>>> lst = ['a', 'ab', 'abc'] #Slow - Checking membership with list >>> 'abc' in lst True >>> mySet = set(['a', 'ab', 'abc'])# Fast - checking membership with set or dictionary >>> 'abc' in mySet True
เคล็ดลับที่ 11:ผลลัพธ์ของแคชด้วยตัวตกแต่งหลาม
สัญลักษณ์มัณฑนากรหลามคือ “@” เราสามารถใช้ python decorator ไม่เพียงแต่สำหรับการติดตาม การล็อก หรือการบันทึกเท่านั้น เรายังสามารถใช้เพื่อตกแต่งฟังก์ชัน python เพื่อให้จำผลลัพธ์ที่ต้องการได้ในภายหลัง (การท่องจำ)
>>> from functools import wraps >>> def memo(f): cache = {} @wraps(f) def wrap(*arg): if arg not in cache: cache['arg'] = f(*arg) return cache['arg'] return wrap
และเราสามารถใช้มัณฑนากรนี้กับฟังก์ชันฟีโบนักชี
>>> @memo def fib(i): if i<2: return 1 return fib(i-1) + fib(i-2)
แนวคิดพื้นฐานคือการปรับปรุง (ตกแต่ง) ฟังก์ชันของคุณให้จำคำศัพท์ฟีโบนักชีแต่ละคำที่คุณคำนวณ หากอยู่ในแคช ไม่จำเป็นต้องคำนวณอีก