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

เคล็ดลับการเพิ่มประสิทธิภาพสำหรับรหัส Python?


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

เคล็ดลับที่ 1:ลองใช้ฟังก์ชันในตัว

แม้ว่าเราจะสามารถเขียนโค้ดที่มีประสิทธิภาพใน python ได้ แต่ก็ยากที่จะเอาชนะฟังก์ชันในตัว (ซึ่งเขียนด้วยภาษา C) ภาพด้านล่างแสดงรายการฟังก์ชันในตัวของ python

เคล็ดลับการเพิ่มประสิทธิภาพสำหรับรหัส 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)

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