Thuộc tính đối tượng truy cập Python

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ó

Truy cập thuộc tính là gì?

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 nameage 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ặc age từ đối tượng person

Để 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ạn

Cách truy cập thuộc tính hoạt động

Bâ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ính

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

điểm chuẩn

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

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

Chủ Đề