Ví dụ đối tượng miễn phí Python

Mỗi khi bạn tạo một thể hiện của một lớp trong Python, bạn đang sử dụng hết một số bộ nhớ – bao gồm cả chi phí thực tế có thể lớn hơn dữ liệu mà bạn quan tâm. Tạo một triệu đối tượng và bạn có chi phí gấp một triệu lần

Và chi phí đó có thể tăng lên, ngăn cản bạn chạy chương trình của mình hoặc tăng số tiền bạn chi cho việc cung cấp phần cứng

Vì vậy, hãy xem chi phí thực sự lớn như thế nào [xem trước. nó lớn. ] và những gì bạn có thể làm về nó

Không chú ý đến từ điển đằng sau bức màn

Trong Python, đằng sau hậu trường, mọi phiên bản của một lớp bình thường lưu trữ các thuộc tính của nó trong từ điển

Do đó, việc sử dụng bộ nhớ cho một đối tượng bình thường có ba nguồn

  1. Chi phí thông thường của bất kỳ đối tượng Python nào, có thể là cá thể, số nguyên hoặc những gì bạn có, cộng với chi phí của một từ điển trống
  2. Chi phí lưu trữ các mục trong từ điển
  3. Dữ liệu thực tế được thêm vào dưới dạng thuộc tính

Ví dụ

from random import random

class Point:
    def __init__[self, x]:
        self.x = x


objects = []
for _ in range[1000000]:
    r = random[]
    point = Point[r]
    objects.append[point]

Chúng ta có thể hình dung mức sử dụng bộ nhớ cao nhất


Và chúng ta có thể thấy mức sử dụng bộ nhớ của ba loại đó, cộng thêm loại thứ tư

  1. Point đối tượng nói chung. 30% bộ nhớ
  2. Thêm một thuộc tính vào từ điển của Point. 55% bộ nhớ
  3. Các số dấu phẩy động. 11% bộ nhớ
  4. Danh sách lưu trữ các đối tượng Point. 4% bộ nhớ

Về cơ bản, mức sử dụng bộ nhớ cao ít nhất gấp 10 lần so với thông tin thực tế mà chúng tôi quan tâm, mục 3, các số dấu phẩy động ngẫu nhiên

Giải pháp số 1. Tạm biệt, từ điển

Có một từ điển cho mọi đối tượng sẽ có ý nghĩa nếu bạn muốn thêm các thuộc tính tùy ý vào bất kỳ đối tượng cụ thể nào. Hầu hết thời gian chúng tôi không muốn làm điều đó. có một tập hợp các thuộc tính nhất định mà chúng tôi biết một lớp sẽ có, và đó là nó

Nhập __slots__. Bằng cách đặt thuộc tính này trên một lớp, với một danh sách các chuỗi cho biết danh sách các thuộc tính

  1. Chỉ những thuộc tính đó mới được phép
  2. Quan trọng hơn đối với mục đích của chúng tôi, Python sẽ không tạo từ điển cho mọi đối tượng

Tất cả những gì chúng ta phải làm là thêm một dòng mã

from random import random

class Point:
    __slots__ = ["x"]  # 

Chủ Đề