Cách tối ưu hóa vòng lặp trong Python

Mã tối ưu hóa Python liên quan đến việc chọn tùy chọn tối ưu cho nhà phát triển từ các tùy chọn khả thi khác nhau. Python là một trong những ngôn ngữ lập trình phát triển web và AI phổ biến nhất vì nó năng động, linh hoạt và dễ học. Bài viết này sẽ đi qua một số quy trình và mẫu tối ưu hóa trong Python có thể giúp bạn nâng cao hiệu suất của các dự án Python của mình

Python đã phát triển thành một ngôn ngữ lập trình linh hoạt và đáng tin cậy cho nhu cầu máy tính hiện đại kể từ năm 1991. Python là ngôn ngữ lập trình đa năng được sử dụng để phát triển web, tạo mẫu phần mềm, phân tích dữ liệu, v.v. Một trong những tính năng tốt nhất của ngôn ngữ này là cách học đơn giản và mức độ nhất quán của ngôn ngữ này trong một loạt các ứng dụng. Mức độ phổ biến của trăn thật đáng kinh ngạc, bằng chứng là thống kê sau

  • Theo Statista, 48. 24% nhà phát triển sử dụng Python trên toàn cầu

  • Theo , Python là ngôn ngữ được tìm kiếm nhiều nhất trong năm thứ năm với 67. 83%

  • Từ các xu hướng của Google, có thể kết luận rằng có khoảng 67 truy vấn liên quan đến python

Bây giờ chúng ta đã biết mức độ phổ biến của Python, hãy xem xét các vấn đề gặp phải khi làm việc với python. Các vấn đề về hiệu suất Python phổ biến

Vấn đề hiệu suất Python phổ biến

Trước khi chúng ta đi vào các mẹo và thủ thuật tối ưu hóa python, điều quan trọng là phải xem xét các lý do khiến Python chậm hơn so với các đối thủ cạnh tranh của nó

1. Các vấn đề về tốc độ Python

Nhiều tính năng phần cứng đã được tạo ra với phần cứng có sẵn tại thời điểm đó. Điều chỉnh thiết kế ngôn ngữ để phù hợp với những tiến bộ trong công nghệ phần cứng là một công việc tốn nhiều thời gian. Mặc dù các ứng dụng python đã có thể được gỡ bỏ và xây dựng lại, nhưng việc thực hiện các thay đổi có thể cải thiện thiết kế cốt lõi của nó, làm cho nó tương thích với các phiên bản Python trong tương lai

2. Python là một ngôn ngữ thông dịch

Python thường xuyên được giải thích, đây là một trong những điểm khác biệt đáng kể nhất giữa nó và các ngôn ngữ khác. Các ngôn ngữ được thông dịch chậm hơn các ngôn ngữ được biên dịch vì mỗi lệnh yêu cầu nhiều lệnh máy hơn để thực thi so với các đối tác trình biên dịch của chúng. Trong các ngôn ngữ được biên dịch, các tệp thực thi được tạo trước thời hạn và thường chứa mã byte hoặc mã tương đương, không yêu cầu biên dịch thêm để chạy chương trình

Mặt khác, Python đòi hỏi phải giải thích liên tục. Khi nào. pyc được biên dịch, có một số bộ nhớ đệm mã byte xảy ra. Tuy nhiên, vì java và. net sử dụng Just-In-Time-Complier, không có mah cho các ngôn ngữ này [JIT]. PyPy được thiết kế có tính đến JIT và lợi ích rất rõ ràng. nó chạy nhanh gấp 4-5 lần so với CPython thông thường

3. Python được gõ động

Một trong những tính năng tốt nhất của Python là bạn không phải xác định loại biến mỗi khi bạn khai báo nó. Đây là một loại mã Python tương đối phổ biến

Test = 0
Test = "bear"
Test = {"Yellow" : "Fellow"}

Tuy nhiên, một tuyên bố như vậy sẽ có tác động đáng kể đến hiệu suất của ngôn ngữ. Trình thông dịch trong các ngôn ngữ kiểu động như Python không biết loại biến nào được định nghĩa khi chương trình chạy. Điều này có nghĩa là sẽ cần nhiều công việc hơn để xác định loại dữ liệu được lưu trữ trong một biến trong Python trước khi nó có thể được sử dụng trong một câu lệnh. Ví dụ: giả sử chúng ta có một mảnh như vậy trong C

int a = 0;
int b = 1;
int sum = a + b;

Trong Python, chúng tôi có một tương đương

a = 0
b = 0
sum = a + b

Mã C sẽ luôn vượt trội so với phiên bản Python về hiệu suất. Cơ sở lý luận này là khi kiểu dữ liệu của một biến được khai báo rõ ràng cho môi trường thời gian chạy, nó có thể dễ dàng áp dụng các tối ưu hóa liên quan đến các kiểu dữ liệu khác nhau để tăng hiệu quả. Hơn nữa, khi một biến được truy cập, thời gian chạy không cần thiết để đánh giá loại dữ liệu chứa trong đó. Thông tin này đã được biết đến với nó, giúp loại bỏ một số lượng lớn các hành động trùng lặp khác. Điều này có nghĩa là cần phải thực hiện nhiều bước bổ sung khi giải quyết các tình huống như vậy bằng các ngôn ngữ được viết động như Python, điều này làm giảm hiệu quả của môi trường

4. Python có thể gây ra tình trạng sử dụng bộ nhớ không hiệu quả

Bởi vì các đối tượng Python thiếu các loại chính xác, nên việc thực hiện các hoạt động đơn giản bắt buộc phải thực hiện một số hành động dư thừa. Tuy nhiên, có một khó khăn đáng kể khác với danh sách đối tượng Python. Các danh sách được lưu trữ trong Python khác với các mảng truyền thống; . Các liên kết này sẽ đưa bạn đến dữ liệu thực tế. Điều này có thể dẫn đến một tình huống rối rắm, tương tự như thế này

Mảng NumPy, là các đối tượng được xây dựng xung quanh các mảng C nguyên thủy, được tạo ra để chống lại điều này. Do đó, cấu trúc của chúng là cần thiết, việc thay đổi và truy cập dữ liệu rất dễ dàng

5. Không hỗ trợ Đồng thời

Đây không phải là một bước thụt lùi vì đây là lĩnh vực mà Python có thể đã cải thiện. Hầu hết các ngôn ngữ lập trình đều cho phép bạn tận dụng một số lõi xử lý mà các máy hiện tại được trang bị. Mặc dù quá trình xử lý đa lõi rất phức tạp, nhưng nó mang lại hiệu suất đáng kể. Nó cũng cung cấp khả năng cân bằng tải tốt hơn trong trường hợp công việc hiệu suất cao, mang lại trải nghiệm người dùng dễ chịu hơn

Truy cập đồng thời vào một biến phải được kiểm soát chặt chẽ, đây là một trong những thách thức đáng kể mà hành vi này mang lại. Các tình huống như điều kiện cuộc đua, bế tắc và bế tắc, nếu không được quản lý hiệu quả, có thể khiến một ứng dụng đang hoạt động không sử dụng được trong vài giây. Để ngăn chặn điều này, khái niệm khóa được sử dụng. Khóa được sử dụng để ngăn nhiều luồng truy cập các biến nhạy cảm cùng một lúc

Mặt khác, thời gian chạy CPython triển khai một khóa có tên là GIL [Khóa phiên dịch toàn cầu] để ngăn chặn bất kỳ hai luồng nào hoạt động cùng một lúc. Trong các hệ thống có CPU lõi đơn, điều này thường tạo ra một chút khác biệt. Tuy nhiên, nó phủ nhận lợi thế của việc có bộ xử lý đa lõi vì chỉ có một mã có thể được sử dụng tại bất kỳ thời điểm nào. Một điều cần nhớ là luôn có không gian để cải thiện

Bây giờ chúng ta đã tìm hiểu về các mối quan tâm tối ưu hóa python điển hình nhất, chúng ta có thể chuyển sang bước tiếp theo. Hãy xem cách đo lường hiệu suất của Python

cũng đọc. – Các phương pháp hay nhất về Python để tuân theo vào năm 2023

Phương pháp để kiểm tra hiệu suất python

Nếu bạn chưa bao giờ thực hiện kiểm tra hiệu suất trước đây, bạn có thể không biết bắt đầu từ đâu. Thông thường, chúng tôi sẽ chụp dấu thời gian của mã trước và sau khi mã chạy và khi chúng tôi chạy đoạn mã của mình. Hãy xem xét một số cách tiếp cận để đánh giá hiệu suất của mã python

Ở đây nó được chia thành 2 phần

  1. Kiểm tra hiệu suất bằng Brute Force
  2. Kiểm tra hiệu suất bằng thư viện & Profilers

Kiểm tra hiệu suất với Brute Force

Bạn có thể sử dụng mô-đun DateTime trong Python để thực hiện việc này

import datetime
start_time = datetime.datetime.now[]
# insert code snippet here
end_time = datetime.datetime.now[]
print[end_time - start_time]

Tất nhiên, giải pháp này để lại rất nhiều điều mong muốn. Nó chỉ cung cấp cho chúng ta một điểm dữ liệu, ví dụ. Chúng tôi muốn chạy nó một vài lần để có giới hạn trung bình hoặc thấp hơn

Kiểm tra hiệu suất bằng Thư viện & Trình cấu hình

Thư viện bao gồm là

  1. thời gian
  2. line_profiler
  3. memory_profiler
  4. thư viện cProfile

1. Thư viện thời gian

Bạn có tùy chọn loại bỏ mọi thứ nhảm nhí bằng cách bổ sung các đặc quyền. Hãy xem thư viện timeit. Thư viện timit có 2 cách chính để test code. dòng lệnh và nội tuyến

Để kiểm tra mã sử dụng thư viện timeit, bạn phải sử dụng phương thức timeit hoặc phương thức lặp lại. Cả hai đều ổn, nhưng tính năng lặp lại giúp bạn kiểm soát nhiều hơn một chút

[[a, b] for a in [1, 3, 5] for b in [2, 4, 6]]

Trong ví dụ này, chúng tôi đang tạo một danh sách các cặp từ hai bộ dữ liệu. Để kiểm tra, chúng ta có thể sử dụng hàm timeit

import timeit
timeit.timeit["[[a, b] for a in [1, 3, 5] for b in [2, 4, 6]]"]

Nếu mọi thứ diễn ra theo đúng kế hoạch, đoạn mã này sẽ thực thi một triệu lần và báo cáo thời gian thực hiện trung bình. Tất nhiên, bạn có thể thay đổi đầu vào và số lần lặp lại

import timeit
timeit.timeit["[[a, b] for a in [1, 3, 5] for b in [2, 4, 6]]", number=1000]

Sử dụng chức năng lặp lại, quá trình này được lặp lại nhiều lần

import timeit
timeit.repeat["[[a, b] for a in [1, 3, 5] for b in [2, 4, 6]]"]

Hàm tạo danh sách thời gian thực hiện thay vì thời gian thực hiện. Danh sách sẽ chứa ba thời gian thực hiện khác nhau trong tình huống này. Chúng tôi không cần tất cả những khoảng thời gian đó;

________số 8

2. line_profiler

Thư viện thứ hai mà chúng ta sẽ xem xét được gọi là trình cấu hình dòng và nó có ứng dụng hơi khác so với các thư viện khác. Bạn có thể nhận được các giải pháp có một không hai với thư viện trình lược tả dòng. Bạn có thể nhận được thời gian thực hiện của từng dòng trong một tệp bằng cách sử dụng mô-đun trình lược tả dòng. Nếu bạn gặp khó khăn trong việc giới hạn các thói quen chậm hoặc nếu bên thứ ba gọi tệp lớn hơn, thì điều này khá tiện lợi

Thay vì đi hết dòng này đến dòng mã dày đặc khác, việc xem thời gian dành cho mỗi dòng cho phép bạn nhanh chóng phát hiện ra các lỗi

Việc sử dụng thông thường của trình cấu hình dòng lúc đầu có thể hơi khó hiểu, nhưng sau một vài lần sử dụng, nó sẽ trở thành bản chất thứ hai. Bạn phải thêm trình trang trí @profile vào từng chức năng để lập cấu hình cho nó. Để hiểu rõ hơn, hãy xem xét ví dụ sau

#!/usr/bin/env python3
# test.py
import time
@profile
def long_function[]:
    print['function start']
    time.sleep[5]
    print['function end']
long_function[]

Nó không đơn giản sao? . Bạn phải làm hai việc ngoài mã để sử dụng trình lược tả dòng

int a = 0;
int b = 1;
int sum = a + b;
0

Trình cấu hình dòng sẽ được chạy trên tệp của bạn và một tệp riêng biệt. tệp lprof sẽ được tạo trong cùng thư mục với lệnh đầu tiên. Kết quả của việc này. tệp lprof có thể tạo báo cáo bằng chính mô-đun trong lệnh thứ hai. Hãy xem đầu ra của lệnh thứ hai

int a = 0;
int b = 1;
int sum = a + b;
1

Số liệu thống kê cho từng dòng của các chức năng được định hình được liệt kê. Bởi vì chúng tôi dành nhiều thời gian cho chức năng ngủ dài, chiếm gần như toàn bộ thời gian thực hiện, nên bạn sẽ có thể nhanh chóng thiết lập nơi bạn nên tập trung nỗ lực của mình, cho dù đó là tái cấu trúc hay tăng tốc các công việc chậm

3. Memory_profile

Trình lược tả bộ nhớ tương tự như trình lược tả dòng, ngoại trừ nó tập trung vào việc tạo số liệu thống kê về việc sử dụng bộ nhớ. Khi bạn chạy trình lược tả bộ nhớ trên mã của mình, nó sẽ cung cấp cho bạn bảng phân tích theo từng dòng, tập trung vào mức sử dụng bộ nhớ tổng và gia tăng theo dòng

Chúng tôi sẽ sử dụng cùng một cấu trúc trang trí để kiểm tra mã của chúng tôi như chúng tôi đã làm trong trình lược tả dòng. Đây là phiên bản sửa đổi của mã mẫu

int a = 0;
int b = 1;
int sum = a + b;
2

Trong ví dụ trước, chúng tôi thiết lập một danh sách kiểm tra và điền vào đó nhiều số nguyên. Điều này dần dần mở rộng danh sách, cho phép chúng tôi theo dõi mức tăng sử dụng bộ nhớ theo thời gian. Chạy lệnh sau để xem báo cáo bộ nhớ

a = 0
b = 0
sum = a + b
3

Điều này sẽ tạo ra báo cáo sau đây, chứa số liệu thống kê bộ nhớ trên cơ sở từng dòng

int a = 0;
int b = 1;
int sum = a + b;
3

Như bạn có thể thấy, chức năng của chúng tôi lúc đầu sử dụng khoảng 38 MB bộ nhớ và sau đó tăng lên 41. 9 MB sau khi danh sách của chúng tôi được lấp đầy. Mặc dù thư viện tài nguyên cung cấp các số liệu về mức tiêu thụ bộ nhớ, nhưng nó không cung cấp phân tích chi tiết từng dòng một như trình lược tả bộ nhớ. Đây là cách nên làm nếu bạn đang tìm kiếm rò rỉ bộ nhớ hoặc xử lý một ứng dụng đặc biệt nặng

4. cProfiler

Các công cụ định hình khác, chẳng hạn như cProfile, có thể được sử dụng ngoài timeit và brute force. Chúng tôi có thể sử dụng cProfile để thu thập số liệu thống kê thời gian chạy từ một phần mã, giống như chúng tôi có thể làm với timeit. Mặt khác, cProfile kỹ lưỡng hơn rất nhiều. Chẳng hạn, chúng ta có thể sử dụng cách hiểu danh sách giống như trước đây

int a = 0;
int b = 1;
int sum = a + b;
4

Kết quả là đầu ra, bạn có thể nhận được một báo cáo trông như thế này

int a = 0;
int b = 1;
int sum = a + b;
5

Chúng tôi có được một bảng tuyệt vời với rất nhiều thông tin hữu ích trong phần này. Mỗi cột phân tách một phân đoạn thời gian chạy khác nhau và mỗi hàng biểu thị một chức năng đã được thực thi. Ví dụ, hàm listcomp> được gọi một lần [ncalls] và nhận 0. 000 giây [tottime], bỏ qua các cuộc gọi chức năng con. Kiểm tra phân tích sau đây về tất cả sáu cột để hiểu mọi thứ khác trong bảng này

Bạn đang muốn thuê nhà phát triển Python?

Thuê một nhóm chuyên dụng từ Aglowid dành cho các nhà phát triển python chất lượng cao, những người được trang bị bộ kỹ năng Python mới nhất

  • cuộc gọi

Số lần một phương thức cụ thể được gọi. Con số này có thể được biểu thị dưới dạng phân số [e. g. , 3/1]. Giá trị đầu tiên biểu thị tổng số cuộc gọi và giá trị thứ hai biểu thị số lượng cuộc gọi nguyên thủy [không đệ quy]

  • toàn thời gian

Tổng thời gian dành để thực hiện chức năng, không bao gồm các lệnh gọi đến chức năng con

  • Mỗi cuộc gọi

Tỷ lệ tottime so với ncalls được gọi trên mỗi cuộc gọi [đầu tiên] [i. e. , lượng thời gian trung bình dành cho chức năng này không bao gồm các chức năng con]

  • kiêm

Bao gồm lệnh gọi đến các chức năng con, tổng thời gian thực hiện chức năng đó

  • Mỗi cuộc gọi

Tỷ lệ các cuộc gọi cumtime so với các cuộc gọi nguyên thủy [i. e. , lượng thời gian trung bình dành cho chức năng này]

  • tên tệp. dòng [chức năng]

Tên tệp, số dòng và chức năng được yêu cầu

Như bạn có thể thấy, cProfile cho phép bạn xem trong một đoạn mã. Tất nhiên, bạn sẽ không nhận được thời gian chi tiết, vì vậy đây là phần bổ sung hơn là thay thế cho timeit. cProfile sẽ là lý tưởng cho các tập lệnh định hình quan trọng. Bằng cách đó, bạn sẽ có thể thấy chức năng nào cần được cải thiện

cũng đọc. – Python so với Java

Mẹo & thủ thuật tối ưu hóa Python

Các mẹo và thủ thuật này để tối ưu hóa hiệu suất mã python nằm trong lĩnh vực python. Sau đây là danh sách các mẹo hiệu suất python

1. Chuỗi thực tập cho hiệu quả

Thực tập một chuỗi là một kỹ thuật chỉ lưu trữ một bản sao của mỗi chuỗi duy nhất. Chúng ta cũng có thể yêu cầu trình thông dịch Python sử dụng lại các chuỗi bằng cách sửa đổi mã của chúng ta để thực hiện chuỗi. Khi chúng ta xây dựng một đối tượng chuỗi, trình thông dịch python thường quyết định xem chuỗi có được lưu vào bộ đệm hay không. Bản chất cơ bản của trình thông dịch xuất hiện trong các trường hợp cụ thể, chẳng hạn như khi xử lý số nhận dạng

Khai báo một chuỗi có tên bắt đầu bằng một chữ cái hoặc dấu gạch dưới và chỉ chứa hoặc kết hợp các chữ cái, dấu gạch dưới và số nguyên khiến Python thực tập chuỗi và tạo hàm băm cho nó. Python chứa rất nhiều mã nội bộ sử dụng từ điển, khiến nó thực hiện nhiều tìm kiếm định danh. Do đó, việc thực hiện các chuỗi nhận dạng sẽ tăng tốc toàn bộ quy trình. Nói một cách đơn giản, Python lưu trữ tất cả các mã định danh trong một bảng và tạo các khóa [băm] duy nhất cho từng mục để tra cứu trong tương lai. Việc tối ưu hóa này xảy ra trong suốt quá trình biên dịch. Nó cũng bao gồm sự đan xen của các chuỗi ký tự giống như các mã định danh

Do đó, đây là một tính năng hữu ích trong Python mà bạn có thể tận dụng. Loại chức năng này có thể hỗ trợ xử lý các ứng dụng phân tích hoặc khai thác văn bản lớn vì chúng yêu cầu tìm kiếm thường xuyên và lật thông báo để ghi sổ kế toán

Tự động thực tập trong Python không bao gồm các chuỗi được đọc từ tệp hoặc nhận được qua giao tiếp mạng. Thay vào đó, bạn có thể ủy thác công việc này cho hàm intern[] chịu trách nhiệm xử lý các tình huống như vậy

2. Tối ưu hóa lỗ nhìn trộm

Peephole optimization is a method that optimizes a small segment of instructions from a program or a section of the program. This segment is then known as or . It helps in spotting the instructions that you can replace with a minified version.

Với ví dụ dưới đây, chúng ta có thể có được kiến ​​thức toàn diện về các giao dịch Python với tối ưu hóa lỗ nhìn trộm

ví dụ 1

Một hàm trong ví dụ khởi tạo hai thành viên của nó. Một trong số chúng là một chuỗi và cái còn lại là một số. Sau đó, một thuộc tính mã khác được thêm vào hàm, với giá trị mặc định là. Điều hấp dẫn là bốn [các] chữ sẽ vẫn là hằng số trong bộ nhớ của bạn. Vui lòng xem hình bên dưới để biết thêm thông tin

Bạn có thể nhận thấy rằng chúng tôi đã sử dụng hằng số. mã số. co consts> trong ảnh chụp màn hình kèm theo. Đó là một trong ba bộ dữ liệu mà mọi đối tượng hàm Python nắm giữ. Trong Python, một hàm cũng là một đối tượng. Nó được tạo thành từ ba bộ dữ liệu được liệt kê dưới đây

  1. a = 0
    b = 0
    sum = a + b
    4 Giữ các biến cục bộ bao gồm các tham số
  2. a = 0
    b = 0
    sum = a + b
    5Lưu trữ văn bản toàn cầu
  3. a = 0
    b = 0
    sum = a + b
    6Tham chiếu đến tất cả các hằng số

ví dụ 2

Chúng tôi đang sử dụng toán tử “in” để tìm một phần tử cụ thể trong một tập hợp trong ví dụ này. Python sẽ nhận ra rằng tập hợp đang được sử dụng để xác thực tư cách thành viên của một phần tử. Do đó, bất kể kích thước của tập hợp, nó sẽ coi các hướng dẫn là hoạt động chi phí không đổi. Và nó sẽ xử lý chúng nhanh hơn một tuple hoặc một danh sách. Trong Python, điều này được gọi là thử nghiệm thành viên. Vui lòng xem ảnh chụp màn hình đính kèm

3. Sử dụng Trình tạo và Khóa để Sắp xếp

Trình tạo là một cách tuyệt vời để tiết kiệm dung lượng trong bộ nhớ của bạn. Chúng làm cho việc viết các hàm trả về một thứ tại một thời điểm [bộ lặp] dễ dàng hơn là tất cả cùng một lúc. Khi bạn lập một danh sách dài các con số và cộng tất cả chúng lại với nhau, đây là một minh họa tuyệt vời

Bạn cũng nên sử dụng các phím và hàm sort[] mặc định nếu khả thi khi sắp xếp các mục trong danh sách. Kiểm tra xem danh sách có được sắp xếp theo chỉ mục được chỉ định trong tham số tới hạn trong ví dụ sau không. Các chuỗi có thể được xử lý theo cùng một cách

int a = 0;
int b = 1;
int sum = a + b;
6

đầu ra

int a = 0;
int b = 1;
int sum = a + b;
7

4. Tối ưu hóa vòng lặp

Hầu hết các ngôn ngữ lập trình đều nhấn mạnh nhu cầu tối ưu hóa các vòng lặp. Chúng tôi có một cơ chế để làm cho vòng lặp chạy nhanh hơn trong Python. Xem xét cách cấm sử dụng dấu chấm trong một vòng lặp mà nhiều lập trình viên bỏ qua

Có một vài thành phần xây dựng hỗ trợ vòng lặp trong Python. Việc sử dụng một vòng lặp “for” là phổ biến trong số ít này. Mặc dù bạn có thể thích sử dụng các vòng lặp, nhưng chúng có giá. Trình thông dịch Python tốn rất nhiều thời gian để giải mã cấu trúc vòng lặp for. Do đó, tốt hơn hết là sử dụng các cấu trúc tích hợp sẵn như Bản đồ để thay thế chúng

Sau đó, mức độ tối ưu hóa mã được xác định bởi sự hiểu biết của bạn về các khả năng tích hợp sẵn của Python. Chúng tôi sẽ cố gắng minh họa cách các cấu trúc khác nhau có thể hỗ trợ tối ưu hóa vòng lặp trong các trường hợp bên dưới

4. 1. Ví dụ để tối ưu hóa vòng lặp trong Python

Thí dụ

Hãy xem xét một hàm sử dụng vòng lặp for để cập nhật danh sách Mã vùng, cắt bỏ khoảng trắng ở cuối và cập nhật danh sách Mã vùng

int a = 0;
int b = 1;
int sum = a + b;
8

Xem cách bạn có thể sử dụng đối tượng bản đồ để chuyển đổi phần trên thành một dòng. Bây giờ nó cũng sẽ rẻ hơn

a = 0
b = 0
sum = a + b
7

Việc hiểu danh sách thậm chí có thể được sử dụng để làm cho cú pháp tuyến tính hơn

a = 0
b = 0
sum = a + b
8

Cuối cùng, chuyển đổi vòng lặp for thành biểu thức trình tạo là phương pháp nhanh nhất

a = 0
b = 0
sum = a + b
9

4. 2. Hãy xem chúng tôi đã tối ưu hóa những gì?

Như đã nêu trước đây, kỹ thuật nhanh nhất để tối ưu hóa vòng lặp for trong trường hợp sử dụng nhất định là sử dụng biểu thức trình tạo [và nói chung]. Chúng tôi đã kết hợp mã từ bốn phiên bản khác nhau để bạn có thể thấy mỗi chiến lược đã cải thiện hiệu suất như thế nào

int a = 0;
int b = 1;
int sum = a + b;
9

đầu ra

a = 0
b = 0
sum = a + b
0

5. Sử dụng Set Operations

Python quản lý các tập hợp thông qua bảng băm. Khi chúng ta thêm một phần tử vào một tập hợp, trình thông dịch Python sử dụng hàm băm của phần tử đích để xác định vị trí của nó trong RAM được phân bổ cho tập hợp

Vì Python tự động thay đổi kích thước bảng băm nên tốc độ không đổi [O[1]] bất kể kích thước của tập hợp. Đây là những gì cho phép các hoạt động thiết lập chạy nhanh hơn

Hợp, giao và chênh là ví dụ về các phép toán tập hợp trong Python. Do đó, bạn có thể thử kết hợp chúng vào mã của mình khi thích hợp. Chúng thường nhanh hơn so với việc xem qua từng danh sách một

a = 0
b = 0
sum = a + b
1

6. Tránh sử dụng Globals

Việc sử dụng toàn cầu quá mức hoặc lộn xộn không được tán thành trong thực tế tất cả các ngôn ngữ lập trình. Lý do cho điều này là chúng có thể gây ra những hậu quả không mong muốn dẫn đến mã Spaghetti. Hơn nữa, Python tương đối chậm khi truy cập các biến ngoại lai

Tuy nhiên, nó cho phép sử dụng hạn chế các biến toàn cục. Từ khóa toàn cục có thể được sử dụng để khai báo một biến ngoài. Ngoài ra, trước khi sử dụng chúng bên trong các vòng lặp, hãy tạo một bản sao cục bộ

7. Sử dụng Thư viện/Gói bên ngoài

Một số thư viện Python có “C” tương đương có cùng chức năng như bản gốc. Chúng chạy nhanh hơn vì chúng được viết bằng “C. ” Hãy thử sử dụng cPickle thay vì dưa chua làm ví dụ

Sau đó, bạn có thể sử dụng Cython>, đây là trình biên dịch tối ưu hóa tĩnh cho cả Python và C++. Đó là một siêu bộ Python có thêm hỗ trợ cho các hàm và kiểu C. Nó hướng dẫn trình biên dịch tạo mã vừa nhanh vừa hiệu quả

Cân nhắc sử dụng cả gói PyPy. Nó đi kèm với trình biên dịch JIT [Just-in-time] cho phép mã Python chạy nhanh. Bạn thậm chí có thể điều chỉnh nó để tăng sức mạnh xử lý

Đang tìm kiếm một công ty phát triển ứng dụng web?

Chúng tôi tại Aglowid cung cấp các giải pháp phát triển ứng dụng web tùy chỉnh đầu cuối cho các Công ty khởi nghiệp, SMB, đại lý và doanh nghiệp

8. Sử dụng toán tử tích hợp

Python là một ngôn ngữ giải thích dựa trên trừu tượng hóa cấp cao. Do đó, bất cứ khi nào có thể, bạn nên sử dụng công cụ tích hợp sẵn. Bởi vì các phần mềm tích hợp được biên dịch trước và nhanh chóng, nó sẽ cải thiện hiệu quả mã của bạn. Mặt khác, các bước lặp dài với các bước được giải thích trở nên khá chậm chạp. Tương tự, sử dụng các công cụ tích hợp như bản đồ, giúp tăng tốc độ đáng kể

9. Tra cứu phương pháp giới hạn trong một vòng lặp

Thay vì gọi một phương thức trên đối tượng, bạn nên lưu trữ một cuộc gọi phương thức khi làm việc trong một vòng lặp. Với sự trợ giúp của ví dụ sau, bạn sẽ có thể nắm bắt được khái niệm

a = 0
b = 0
sum = a + b
2

10. Tối ưu hóa với Chuỗi

Nối các chuỗi chậm, do đó, đừng thực hiện trong vòng lặp. Thay vào đó, hãy sử dụng phương thức nối trong Python. Ngoài ra, bạn có thể sử dụng công cụ định dạng để tạo một chuỗi thống nhất

Các thao tác RegEx trong Python rất nhanh vì chúng được ủy quyền cho mã C. Các kỹ thuật chuỗi cơ bản như isalpha[], isdigit[], startedwith[] và endwith[] hoạt động tốt hơn trong một số trường hợp

The module can also be used to test different ways. It will assist you in determining which strategy is the most efficient.

11. Tối ưu hóa với câu lệnh If

Python, giống như hầu hết các ngôn ngữ lập trình, hỗ trợ đánh giá lazy-if. Nó chỉ ra rằng nếu có nhiều điều kiện 'VÀ', không phải tất cả chúng sẽ được kiểm tra nếu một điều kiện thất bại

  1. Bạn có thể sửa đổi mã của mình để tận dụng hành vi của Python. Ví dụ: nếu đang tìm kiếm một mẫu cụ thể trong danh sách, bạn có thể thu hẹp phạm vi bằng cách thêm điều kiện sau. Thêm điều kiện 'VÀ' trả về false nếu độ dài của chuỗi mục tiêu nhỏ hơn độ dài của mẫu. Bạn cũng có thể kiểm tra một điều kiện nhanh [nếu có], chẳng hạn như “chuỗi phải bắt đầu bằng dấu @” hoặc “chuỗi phải kết thúc bằng dấu chấm. ”
  2. Thay vì sử dụng
    import datetime
    start_time = datetime.datetime.now[]
    # insert code snippet here
    end_time = datetime.datetime.now[]
    print[end_time - start_time]
    0, bạn có thể kiểm tra một điều kiện như
    import datetime
    start_time = datetime.datetime.now[]
    # insert code snippet here
    end_time = datetime.datetime.now[]
    print[end_time - start_time]
    1

cũng đọc. – Ruby so với Python

Công cụ tối ưu hóa Python

Như chúng ta đã biết, Python là một ngôn ngữ lập trình đa năng cấp cao, mạnh mẽ với nhiều trường hợp sử dụng và lợi ích tiềm năng. Có nhiều công cụ Tối ưu hóa Python phổ biến và đã được thử nghiệm trên thị trường có thể được tận dụng để thực sự phát huy hết tiềm năng của lập trình Python và giảm thời gian phát triển đồng thời cải thiện hiệu quả và độ chính xác của các dự án Python của bạn. Dưới đây là danh sách 5 công cụ tối ưu hóa hiệu suất Python hàng đầu mà bạn có thể sử dụng

1. nguồn sâu

DeepSource phân tích mã tĩnh trong các ngôn ngữ lập trình khác nhau, bao gồm Python, Javascript, Golang và các ngôn ngữ khác. DeepSource cung cấp tính linh hoạt cũng như khả năng thực hiện phân tích tĩnh trên mã Python một cách đơn giản. DeepSource tạo Tệp cấu hình được lưu trữ trong kho lưu trữ và mã được đánh giá thường xuyên

Một số tính năng của DeepSource bao gồm

  • Để phân tích liên tục, hãy sử dụng cấu hình một tệp
  • Các định dạng mã như Black và AutoPep8 được hỗ trợ
  • Mỗi kéo trải qua một kiểm tra chất lượng
  • Bản sửa lỗi cho các sự cố phổ biến được tự động hóa
  • Để kiểm tra mức độ phù hợp, hãy nhúng vào các đường dẫn CI/CD như Travis CI

So với các công cụ phân tích mã tĩnh khác, DeepSource có tỷ lệ dương tính giả thấp và thời gian giải quyết nhanh. DeepSource giúp người bảo trì dễ dàng đánh giá các vấn đề liên quan đến khung bằng cách cấp cho họ quyền truy cập vào chúng

Bên cạnh đó, DeepSource làm cho việc làm việc với các kho lưu trữ riêng trở nên đơn giản. Mã thông báo riêng được sử dụng để tìm nạp mã với mỗi yêu cầu kéo hoặc cam kết. Sau đó, quá trình phân tích được tiến hành trong môi trường riêng biệt. Việc phân tích sau đó được thực hiện trong một bối cảnh riêng biệt. Cơ sở mã được xóa sau khi quá trình phân tích kết thúc, giảm khả năng vi phạm bảo mật

2. Codacy

Codacy là một công cụ khác cung cấp phạm vi mã và báo cáo đánh giá cho các ngôn ngữ lập trình có mục đích chung khác nhau, chẳng hạn như Python. Codacy giải quyết một loạt các mối quan tâm, bao gồm phạm vi mã, trùng lặp và độ phức tạp. Nó hỗ trợ các nhà phát triển duy trì chất lượng mã và đánh giá mã sạch

Codacy có một số đặc điểm, bao gồm

  • Đánh giá mã có thể được tự động
  • Kiểm tra chất lượng của mã theo thời gian
  • Các nhà phát triển sẽ được hưởng lợi từ các đề xuất tài nguyên tự động
  • Để tránh nhiễu, chỉ những vấn đề mới được tính đến
  • Phân tích và cam kết từng yêu cầu kéo riêng biệt

Sau đây là một số nhược điểm

  • Thiếu mức độ ưu tiên của vấn đề, điều này sẽ hỗ trợ các nhà phát triển tập trung nỗ lực của họ
  • Không có cách nào để xuất các mẫu mã
  • Thật khó để tạo các trang thiết lập

Mặt khác, Codacy là một thiết lập phức tạp, đòi hỏi nhiều cài đặt và có tỷ lệ dương tính giả cao

3. SonarQube

SonarQube thực hiện đánh giá tự động bằng cách liên tục kiểm tra chất lượng mã. Công cụ phân tích mã tĩnh của nó có thể phát hiện lỗi Python, lỗi chống mẫu và thậm chí cả lỗi bảo mật. Để quản lý chất lượng mã hiệu quả, SonarQube cực kỳ đơn giản để tích hợp với đường dẫn CI/CD

Hai trong số các công cụ của SonarQube được sử dụng để triển khai tính năng Phân tích mã. Máy quét Sonar cho phép thực hiện phân tích, với kết quả được xử lý và lưu trên Máy chủ SonarQube

Các tính năng của SonarQube

  • Phát hiện các tình huống khó khăn Các vấn đề như lỗi bảo mật và lỗi trong đường dẫn thực thi
  • Để tự động hóa quy trình xem xét mã, nó cung cấp quyền truy cập vào webhook và API
  • Thực thi một cổng chất lượng theo các tiêu chí và thủ tục
  • Cung cấp các plugin cho nhiều IDE phổ biến, giảm nhu cầu về gói hoàn chỉnh

Một số nhược điểm bao gồm

  • Không có cách nào để thiết lập phân tích và thông báo tự động
  • Nó thiếu một tính năng cho phép bạn bỏ qua các vấn đề không nên giải quyết

Thật khó để thiết lập SonarQube cho một dự án Python vì nó yêu cầu cài đặt các gói và plugin để thiết lập phân tích ứng dụng khách và lưu trữ máy chủ. Để tìm hiểu thêm về cài đặt SonarQube cho dự án Python, hãy tham khảo tài liệu chính thức

4. mã xác thực

Veracode là một công cụ đánh giá mã Python phổ biến khác. Nó không chỉ quét các lỗ hổng và điểm lộ thông thường mà còn có thể phát hiện ra các lỗ hổng bằng cách sử dụng phân tích tĩnh, giúp việc báo cáo lỗi và chống mẫu trở nên đơn giản. Veracode cũng cung cấp các dịch vụ khác thông qua dịch vụ doanh nghiệp của mình, chẳng hạn như phân tích động và tương tác

Sau đây là một số tính năng cần thiết

  • Để giúp kiểm tra chất lượng mã dễ dàng hơn, nó cung cấp các công cụ dành cho nhà phát triển, API và tích hợp quy trình làm việc
  • Tích hợp liền mạch với các quy trình DevOps
  • Quét bằng các tác nhân SCA để phát hiện lỗi và lỗ hổng
  • Luôn cập nhật các thư viện và giấy phép của PyPi
  • Với mỗi lần quét, nó sẽ gửi một điểm rủi ro

Sau đây là một số nhược điểm

  • Nó không đơn giản như nó xuất hiện. Thiết lập để tích hợp liên tục
  • Thiếu trải nghiệm người dùng trực quan

5. dấu kiểm

Checkmarx là một công cụ kiểm tra bảo mật ứng dụng và phân tích mã tĩnh. Nó bao gồm các khả năng như kiểm tra ứng dụng tĩnh, kiểm tra thời gian chạy, kiểm tra tương tác và quét phụ thuộc, cho phép quét nhanh mã nguồn và loại bỏ lỗi

Sau đây là một số tính năng cần thiết

  • Checkmarx SAST được sử dụng để phân tích tĩnh và phát hiện các lỗi bảo mật
  • Tích hợp với các quy trình tích hợp và phân phối liên tục
  • Giao diện người dùng trực quan và dễ sử dụng
  • Có sẵn các plugin cho nhiều IDE phổ biến

Sau đây là một số nhược điểm

  • Tỷ lệ dương tính giả cao
  • Quá trình quét mất nhiều thời gian trong quá trình tích hợp liên tục
  • Điều tốt nhất về Checkmarx là nó có hỗ trợ tích hợp cho hầu hết các ngôn ngữ lập trình có mục đích chung. Mặt khác, Checkmarx gặp vấn đề với thông tin xác thực sai và thiếu hỗ trợ cho các cơ sở mã khổng lồ

kết thúc

Chúng tôi hy vọng các Mẹo và thủ thuật tối ưu hóa hiệu suất Python được đưa ra trong bài viết này có thể giúp bạn xây dựng các ứng dụng Python nhanh hơn. Các mẹo tối ưu hóa python này sẽ giúp bạn chạy mã Python đáng tin cậy hơn ở nhiều mức độ chi tiết khác nhau, từ cấu hình đến cấu trúc dữ liệu đến nối chuỗi và tối ưu hóa bộ nhớ với hàm xrange. Những điểm này được thực hiện để hỗ trợ các lập trình viên Python trong các nhiệm vụ lập trình hàng ngày của họ và hỗ trợ họ viết mã chất lượng cao

Làm cách nào để cải thiện hiệu suất vòng lặp của tôi?

Cách tốt nhất để cải thiện hiệu suất của vòng lặp là giảm số lượng công việc được thực hiện trên mỗi lần lặp và giảm số lần lặp lại vòng lặp .

Bản đồ nào nhanh hơn hoặc cho vòng lặp Python?

map[] hoạt động nhanh hơn nhiều so với vòng lặp for . Xem xét mã tương tự ở trên khi chạy trong ý tưởng này. Sử dụng bản đồ[].

Chủ Đề