Computer >> Máy Tính >  >> Lập trình >> Python

Mẹo tối ưu hóa cho mã Python?

Mặc dù chúng ta đều biết python không nhanh hoặc hiệu quả như các ngôn ngữ tuân thủ khác. Tuy nhiên, có nhiều công ty lớn cho chúng ta thấy rằng mã python có thể xử lý khối lượng công việc lớn hơn nhiều, điều này cho thấy nó không chậm đến vậy. Trong phần này, chúng ta sẽ xem một số mẹo mà người ta nên ghi nhớ để một chương trình python đúng chạy thậm chí còn nhanh hơn và hiệu quả hơn.

Mẹo 1:Truy cập các chức năng tích hợp sẵn

Mặc dù chúng ta có thể viết mã hiệu quả bằng python, nhưng rất khó để đánh bại các hàm tích hợp sẵn (được viết bằng C). Hình ảnh bên dưới hiển thị danh sách các chức năng tích hợp trong python

Mẹo tối ưu hóa cho mã Python?

Mẹo 2:Sử dụng nhiều phép gán trong python để hoán đổi các biến

>>> #Instead of using
>>> x, y = y, x
>>> #Use this - which is much faster
>>> temp = x
>>> x = y
>>> y = temp

Mẹo 3:Tránh các biến toàn cục và sử dụng các biến cục bộ nếu có thể

Python nhanh hơn khi khôi phục một biến cục bộ so với truy xuất một biến toàn cục. Đó là, hãy tránh biến toàn cục nếu có thể.

Mẹo 4:Sử dụng “in” bất cứ khi nào có thể

Để kiểm tra tư cách thành viên nói chung, hãy sử dụng từ khóa “trong”. Nó sạch sẽ và nhanh chóng.

for key in sequence:
   print ("Hello ", key)

Mẹo 5:Sử dụng “while 1” cho vòng lặp vô hạn

Đôi khi chúng ta phải chạy vòng lặp vô hạn trong chương trình của mình (ví dụ:ổ cắm nghe). Mặc dù “while True” sẽ thực hiện cùng một thao tác, “while 1” là một thao tác nhảy đơn lẻ.

>>> while 1:
   # do something, faster with while 1
>>> while True:
   #do something, perform same operation but slower than then previous one

Mẹo 6:Sử dụng khả năng hiểu danh sách

Chúng tôi có thể sử dụng khả năng hiểu danh sách từ python 2.0 để thay thế nhiều khối “for” và “while”. Khả năng hiểu danh sách nhanh hơn nhiều vì nó được tối ưu hóa cho trình thông dịch python để phát hiện một mẫu có thể dự đoán được trong quá trình lặp. Nó dễ đọc hơn và trong hầu hết các trường hợp, nó tiết kiệm thêm một biến để đếm.

Ví dụ để tìm số chẵn từ 1 đến 25 với một dòng:

>>> #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]

Mẹo 7:Sử dụng trình tạo python để nhận giá trị theo yêu cầu

Sử dụng trình tạo python tiết kiệm bộ nhớ và cải thiện hiệu suất. Trong trường hợp bạn đang phát trực tuyến video, bạn có thể gửi một đoạn byte nhưng không gửi toàn bộ luồng.

>>> chunkBytes = (1000 * i for i in range(1000))
>>> next(chunkBytes)
0
>>> next(chunkBytes)
1000
>>> next(chunkBytes)
2000
>>> next(chunkBytes)
3000
>>>

Mẹo 8:Sử dụng mô-đun itertools

Mô-đun itertools rất hữu ích và hiệu quả cho việc lặp lại và kết hợp.

Để tạo tất cả hoán vị cho danh sách [1, 2, 3, 4, 5] trong vài dòng mã python

>>> 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)]

Mẹo 9:Sử dụng mô-đun bisect để giữ danh sách theo thứ tự đã sắp xếp

Đây là một triển khai tìm kiếm nhị phân miễn phí và một công cụ chèn nhanh cho một chuỗi được sắp xếp.

>>> import bisect
>>> bisect.insort(list, element)

Chúng tôi đã chèn phần tử vào danh sách của mình và bây giờ chúng tôi không cần gọi lại sort () để giữ cho vùng chứa được sắp xếp, điều này có thể rất tốn kém trên một chuỗi dài.

Mẹo 10:Sử dụng từ điển và đặt để kiểm tra tư cách thành viên

Vì từ điển và tập hợp được triển khai bằng cách sử dụng bảng băm, việc kiểm tra xem một phần tử có tồn tại trong từ điển hoặc tập hợp hay không trong python rất nhanh. Đôi khi, việc tra cứu nhanh như 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

Mẹo 11:Lưu vào bộ nhớ cache kết quả với trình trang trí python

Biểu tượng của trình trang trí python là “@”. Chúng tôi có thể sử dụng trình trang trí python không chỉ để theo dõi, khóa hoặc ghi nhật ký, chúng tôi có thể sử dụng nó để trang trí chức năng của python để nó ghi nhớ các kết quả cần thiết sau này (ghi nhớ).

>>> 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

Và chúng ta có thể sử dụng trình trang trí này trên một hàm Fibonacci

>>> @memo
def fib(i):
   if i<2:
      return 1
   return fib(i-1) + fib(i-2)

Ý tưởng cơ bản là nâng cao (trang trí) chức năng của bạn để ghi nhớ từng thuật ngữ Fibonacci mà bạn đã tính toán, nếu chúng nằm trong bộ nhớ cache, không cần phải tính toán lại.