Một kỹ thuật tối ưu hóa đơn giản nhưng mạnh mẽ sẽ làm cho chương trình của bạn chạy khoảng 2. nhanh gấp 5 lần
Ảnh của Cole Patrick trên Bapt
Như mọi người đã biết, Python chắc chắn không phải là ngôn ngữ lập trình nhanh. Tuy nhiên, có một vài thủ thuật mà bạn có thể áp dụng để tăng tốc độ thực thi mã của mình một cách đáng kể. Trong bài viết này, tôi sẽ thảo luận về cách gán quyền truy cập bằng cách sử dụng toán tử dấu chấm .
làm chậm chương trình của bạn và bạn có thể làm gì với nó
Vì Python là ngôn ngữ lập trình hướng đối tượng nên nó dựa trên các đối tượng. Những cấu trúc này có thể có những đặc điểm nhất định, được gọi là thuộc tính
Trong ví dụ này, bạn có thể thấy rõ các thuộc tính name
và age
của lớp Person
Để truy cập các thuộc tính, bạn thường sử dụng toán tử dấu chấm như thế này
Vấn đề là việc truy cập một thuộc tính theo cách này là một quá trình gồm hai bước
- Đầu tiên, Máy ảo Python [PVM] phải tải đối tượng
person
- Sau đó, tải thuộc tính được yêu cầu
name
hoặcage
từ đối tượngperson
Để làm cho điều này cụ thể hơn một chút, chúng ta hãy xem cách hai câu lệnh đơn giản này được phân tách trong mã byte Python, ngôn ngữ mà PVM sử dụng, bởi Trình biên dịch Explorer
Như bạn có thể thấy, việc truy cập các thuộc tính thông qua toán tử dấu chấm yêu cầu hai hướng dẫn [
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
1 và Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
2], trong khi truy cập trực tiếp chỉ yêu cầu Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
1 sau khi nó đã được tải vào một biến cục bộ. Về cơ bản, đây là lý do tại sao việc truy cập các thuộc tính đối tượng thông qua toán tử dấu chấm .
có thể làm chậm chương trình của bạnCách truy cập thuộc tính hoạt độngBây giờ chúng ta đã biết rằng hướng dẫn
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
2 là nguyên nhân gây mất tốc độ, hãy khám phá xem nó bao gồm những gìCác hướng dẫn mã byte Python được xử lý, trong mã nguồn Python, trong một câu lệnh chuyển đổi xác định những gì Python phải làm trong từng tình huống. Trong trường hợp của
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
2, lệnh gây ra chi phí truy cập thuộc tính, đây là những gì PVM thực hiện để thực hiện thao tácĐặc biệt, chúng ta quan tâm đến hàm
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
7, đây là nội dung chủ yếu của trình xử lý trường hợp này. Đây là cách trình thông dịch Python tìm kiếm các thuộc tínhNhư bạn có thể thấy, có nhiều bước liên quan đến việc lấy một thuộc tính đối tượng, điều này sẽ được lặp lại một cách vô ích mỗi khi bạn sử dụng toán tử dấu chấm .
trên một đối tượng
Bây giờ chúng ta đã khám phá cách Python xử lý truy cập thuộc tính, đã đến lúc thực hiện một số điểm chuẩn thực tế để sao lưu các câu lệnh của tôi và để biết truy cập trực tiếp nhanh hơn bao nhiêu và trong những tình huống nào bạn chỉ nên sử dụng toán tử dấu chấm
Đối với điểm chuẩn, tôi sẽ sử dụng mô-đun tích hợp Python
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
9. Ngoài ra, tôi sẽ lặp lại bài kiểm tra tốc độ nhiều lần để đảm bảo so sánh công bằngKết quả điểm chuẩn [tất cả các số đều tính bằng giây]
Dot access: 0.0011334399809129537
Direct access: 0.00042231220286339524
Thời gian nói cho chính họ. truy cập trực tiếp vào biến là 2. Nhanh hơn 7 lần so với việc truy cập thuộc tính đối tượng thông qua toán tử dấu chấm, ngay cả khi thuộc tính phải được tải trước vào một biến cục bộ
Bây giờ, hãy thử với một điểm chuẩn lớn hơn để so sánh hai cách tiếp cận trên quy mô lớn như thế nào
Tôi đã giữ nguyên mọi thứ, ngoại trừ số lần lặp lại, mà tôi đã nhân với hệ số 1000. Đây là kết quả, luôn tính bằng giây
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
Cũng trong trường hợp này, truy cập trực tiếp vượt trội so với toán tử dấu chấm. Thực ra là 2. 3 nhanh hơn so với đối tác của nó
Tuy nhiên, nếu điểm chuẩn được thực hiện ở quy mô đủ nhỏ để làm cho thuộc tính ban đầu tải đáng kể, thì lợi thế về tốc độ sẽ biến mất. Trên thực tế, hai chức năng này mất khoảng thời gian gần như nhau để thực hiện
Vì vậy, trừ khi bạn phải truy cập một thuộc tính đối tượng chỉ một lần hoặc một số lần giới hạn, tốt hơn hết bạn nên tải trước thuộc tính đó vào một biến cục bộ để tránh chi phí thực hiện lệnh
Dot access: 0.5189315507886931
Direct access: 0.2250016813748516
2 vô ích đóĐiều này cũng áp dụng cho các mô-đun và đối tượng tích hợp sẵn, như bạn có thể thấy từ điểm chuẩn cuối cùng này
Và kết quả, luôn tính bằng giây
Dot access: 0.568545886001084
Direct access: 0.22544407980749384
Ngay cả trong trường hợp này, truy cập trực tiếp vẫn còn khoảng 2. Nhanh gấp 5 lần so với việc luôn sử dụng toán tử dấu chấm
Phần kết luậnĐể kết thúc, việc truy cập một thuộc tính đối tượng thông qua toán tử dấu chấm sẽ tạo ra một chi phí vô dụng trong các chương trình của bạn, điều này có thể tránh được bằng cách tải thuộc tính đã nói vào một biến cục bộ trước khi sử dụng nó
Cách tiếp cận này không yêu cầu bạn thực hiện kỹ thuật phức tạp trên cơ sở mã của mình, nhưng đây là một kỹ thuật tối ưu hóa mạnh mẽ giúp giảm đáng kể thời gian chạy chương trình của bạn mà không tốn nhiều công sức
Theo nguyên tắc thông thường, bạn phải luôn nghĩ xem mỗi dòng mã bạn viết thực sự đang làm gì từ góc nhìn của máy tính. cách dữ liệu được lấy từ bộ nhớ;
Tôi hy vọng bạn thích bài viết này. Nếu bạn có bất kỳ câu hỏi hoặc muốn thêm bất cứ điều gì, xin vui lòng chia sẻ suy nghĩ của bạn trong một bình luận. Cảm ơn vì đã đọc
Nếu bạn đang muốn tối ưu hóa đơn giản nhưng hiệu quả trong Python, thì tôi khuyên bạn nên xem câu chuyện này bên dưới