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
- 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
- Chi phí lưu trữ các mục trong từ điển
- 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ư
Point
đối tượng nói chung. 30% bộ nhớ- Thêm một thuộc tính vào từ điển của
Point
. 55% bộ nhớ - Các số dấu phẩy động. 11% bộ nhớ
- 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
- Chỉ những thuộc tính đó mới được phép
- 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"] #