Sử dụng phương thức sys.getsizeof[]
để lấy mức sử dụng bộ nhớ của một đối tượng, e. g. ________số 8. Phương thức lấy một đối số đối tượng và trả về kích thước của đối tượng theo byte. Tất cả các đối tượng tích hợp có thể được chuyển đến phương thức sys.getsizeof[]
Phương thức trả về kích thước của một đối tượng theo byte
Đối tượng có thể là bất kỳ loại đối tượng nào và tất cả các đối tượng tích hợp đều trả về kết quả chính xác
Kích thước của một đối tượng bao gồm dữ liệu được lưu trữ bởi đối tượng, các thuộc tính, phương thức, v.v.
Phương thức
%memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
0 chỉ chiếm mức tiêu thụ bộ nhớ trực tiếp của đối tượng, không phải mức tiêu thụ bộ nhớ của các đối tượng mà nó đề cập đếnLưu ý rằng một số đối tượng Python như danh sách và từ điển có thể tham chiếu đến các đối tượng khác và phương thức
%memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
0 không tính đến điều đóCó một công thức sizeof đệ quy trong các tài liệu chính thức. Nó sử dụng đệ quy
%memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
0 để tìm kích thước của một đối tượng và các đối tượng mà nó tham chiếuPhương thức
%memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
3 gọi phương thức %memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
4 của đối tượng, vì vậy nó không xử lý các đối tượng tùy chỉnh không triển khai nóBạn cũng có thể nhập trực tiếp phương thức
%memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
0 thay vì nhập toàn bộ mô-đun %memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
6Kích thước của một đối tượng phụ thuộc vào việc thực hiện. Các hương vị khác nhau của Python có thể sử dụng các cấu trúc dữ liệu nội bộ khác nhau, điều đó có nghĩa là chúng sẽ tạo ra các kết quả khác nhau
Phương thức sys.getsizeof[]
nhận một đối số thứ hai tùy chọn - một giá trị mặc định để trả về nếu đối tượng không cung cấp phương tiện để truy xuất kích thước
Các nhà phát triển Python nên biết về mức tiêu thụ bộ nhớ của mã họ đang viết. Điều này sẽ giúp theo nhiều cách. Có thể là quyết định phần cứng hoặc quyết định nhu cầu tối ưu hóa hoặc tìm rò rỉ bộ nhớ, v.v.
Chúng ta sẽ thảo luận về một thư viện python rất đơn giản nhưng rất hữu ích memory_profiler
pip install memory_profiler#Load its magic function
%load_ext memory_profiler
from memory_profiler import profile
Chúng ta có thể hình dung việc sử dụng memory profiler theo các cách sau.
1. Tìm mức tiêu thụ bộ nhớ của một dòng
2. Tìm mức tiêu thụ bộ nhớ của một hàm
3. Tìm mức tiêu thụ bộ nhớ của một dòng chức năng theo dòng
4. Tìm mức tiêu thụ bộ nhớ của tập lệnh python hoàn chỉnh
Hiện nay. hãy thảo luận về tất cả các tình huống này
- Tìm mức tiêu thụ bộ nhớ của một dòng
Chỉ cần thêm chức năng ma thuật %memit ở đầu dòng
%memit x = 10+5
#Output
peak memory: 54.01 MiB, increment: 0.27 MiB
Ở đây, bộ nhớ cao nhất là bộ nhớ được sử dụng bởi quá trình chạy mã này. Phần tăng không là gì ngoài bộ nhớ được yêu cầu/tiêu thụ do việc bổ sung dòng mã này. Logic tương tự này cũng áp dụng cho các tùy chọn bên dưới
2. Tìm mức tiêu thụ bộ nhớ của một chức năng
Thêm chức năng ma thuật ở đầu dòng từ nơi chức năng được gọi
def addition[]:
a = [1] * [10 ** 1]
b = [2] * [3 * 10 ** 2]
sum = a+b
return sum%memit addition[]
#Output
peak memory: 36.36 MiB, increment: 0.01 MiB
3. Tìm mức tiêu thụ bộ nhớ của một dòng chức năng theo dòng
Để mô tả từng dòng về việc sử dụng bộ nhớ, chúng ta có thể sử dụng trình trang trí @profile. Thật không may, điều này chỉ hoạt động đối với các chức năng được xác định trong các mô-đun riêng biệt chứ không phải chính sổ ghi chép, vì vậy chúng tôi sẽ bắt đầu bằng cách sử dụng ma thuật %%file để tạo một mô-đun đơn giản có tên demo. py, chứa chức năng của chúng tôi
%%file demo.py
from memory_profiler import profile
@profile
def addition[]:
a = [1] * [10 ** 1]
b = [2] * [3 * 10 ** 2]
sum = a+b
return sum
Bây giờ, hãy gọi hàm giống như trong tùy chọn 2
from demo import addition
%memit addition[]#Output
Line # Mem usage Increment Line Contents
================================================
2 36.4 MiB 36.4 MiB @profile
3 def addition[]:
4 36.4 MiB 0.0 MiB a = [1] * [10 ** 1]
5 3851.1 MiB 3814.7 MiB b = [2] * [3 * 10 ** 2]
6 7665.9 MiB 3814.8 MiB sum = a+b
7 7665.9 MiB 0.0 MiB return sum
peak memory: 7665.88 MiB, increment: 7629.52 MiB
4. Tìm mức tiêu thụ bộ nhớ của tập lệnh python hoàn chỉnh
Không thể thử tùy chọn này trong sổ ghi chép. Chúng ta phải tạo một tập lệnh python và chạy nó thông qua dòng lệnh
#create script.py
import time@profile
def function1[]:
n = 100000
a = [1] * n
time.sleep[1]
return a@profile
def function2[]:
n = 200000
b = [1] * n
time.sleep[1]
return bif __name__ == "__main__":
function1[]
function2[]
Sau đó chạy script và xem cốt truyện
#On command line
mprof run script.py
#To generate plot
mprof plot
Chúng ta có thể thấy biểu đồ tiêu thụ bộ nhớ v/s thời gian
thời gian so với ký ức
Xin lưu ý rằng không cần thiết phải đặt trình trang trí @profile trên chức năng, nếu chúng tôi không giữ nó, chúng tôi sẽ không thấy mức tiêu thụ bộ nhớ cấp chức năng nhưng chúng tôi sẽ thấy mức tiêu thụ của toàn bộ tập lệnh