tracemalloc --- Theo dõi phân bổ bộ nhớ¶
Added in version 3.4.
Source code: Lib/tracemalloc.py
Mô-đun tracemalloc là một công cụ gỡ lỗi để theo dõi các khối bộ nhớ được Python phân bổ. Nó cung cấp các thông tin sau:
Truy nguyên nơi một đối tượng được phân bổ
Thống kê về khối bộ nhớ được phân bổ cho mỗi tên tệp và số dòng: tổng kích thước, số lượng và kích thước trung bình của các khối bộ nhớ được phân bổ
Tính toán sự khác biệt giữa hai ảnh chụp nhanh để phát hiện rò rỉ bộ nhớ
Để theo dõi hầu hết các khối bộ nhớ được Python phân bổ, nên khởi động mô-đun càng sớm càng tốt bằng cách đặt biến môi trường PYTHONTRACEMALLOC thành 1 hoặc bằng cách sử dụng tùy chọn dòng lệnh -X tracemalloc. Hàm tracemalloc.start() có thể được gọi trong thời gian chạy để bắt đầu theo dõi việc phân bổ bộ nhớ Python.
Theo mặc định, dấu vết của khối bộ nhớ được phân bổ chỉ lưu trữ khung hình gần đây nhất (1 khung hình). Để lưu trữ 25 khung hình khi khởi động: đặt biến môi trường PYTHONTRACEMALLOC thành 25 hoặc sử dụng tùy chọn dòng lệnh -X tracemalloc=25.
Ví dụ¶
Hiển thị top 10¶
Hiển thị 10 file phân bổ nhiều bộ nhớ nhất:
nhập khẩu tracemalloc
tracemalloc.start()
# ... chạy ứng dụng của bạn ...
ảnh chụp nhanh = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[Top 10]")
cho chỉ số trong top_stats[:10]:
in (thống kê)
Ví dụ về đầu ra của bộ thử nghiệm Python:
[Top 10]
<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, Average=126 B
<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, Average=167 B
/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, Average=108 B
/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, Average=243 B
/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, Average=416 B
/usr/lib/python3.4/abc.py:133: size=88,7 KiB, count=347, Average=262 B
<frozen importlib._bootstrap>:1446: size=70,4 KiB, count=911, Average=79 B
<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, Average=2131 B
<string>:5: size=49,7 KiB, count=148, Average=344 B
/usr/lib/python3.4/sysconfig.py:411: size=48,0 KiB, count=1, Average=48,0 KiB
Chúng ta có thể thấy rằng Python đã tải dữ liệu 4855 KiB (mã byte và hằng số) từ các mô-đun và mô-đun collections đã phân bổ 244 KiB để xây dựng các loại namedtuple.
Xem Snapshot.statistics() để có thêm lựa chọn.
Tính toán sự khác biệt¶
Chụp hai ảnh chụp nhanh và hiển thị sự khác biệt:
nhập khẩu tracemalloc
tracemalloc.start()
# ... bắt đầu ứng dụng của bạn ...
ảnh chụp nhanh1 = tracemalloc.take_snapshot()
#... gọi hàm rò rỉ bộ nhớ...
snapshot2 = tracemalloc.take_snapshot()
top_stats = snapshot2.compare_to(snapshot1, 'lineno')
print("[10 điểm khác biệt lớn nhất]")
cho chỉ số trong top_stats[:10]:
in (thống kê)
Ví dụ về kết quả đầu ra trước/sau khi chạy một số thử nghiệm của bộ thử nghiệm Python:
[10 điểm khác biệt hàng đầu]
<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), trung bình=117 B
/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), trung bình=119 B
/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), trung bình=519 B
<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), trung bình=139 B
/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), trung bình=86 B
/usr/lib/python3.4/http/server.py:848: size=96,0 KiB (+96,0 KiB), count=1 (+1), trung bình=96,0 KiB
/usr/lib/python3.4/inspect.py:1465: size=83,5 KiB (+83,5 KiB), count=109 (+109), trung bình=784 B
/usr/lib/python3.4/unittest/mock.py:491: size=77,7 KiB (+77,7 KiB), count=143 (+143), trung bình=557 B
/usr/lib/python3.4/urllib/parse.py:476: size=71,8 KiB (+71,8 KiB), count=969 (+969), trung bình=76 B
/usr/lib/python3.4/contextlib.py:38: size=67,2 KiB (+67,2 KiB), count=126 (+126), trung bình=546 B
Chúng ta có thể thấy rằng Python đã tải 8173 KiB dữ liệu mô-đun (mã byte và hằng số) và dữ liệu này nhiều hơn 4428 KiB so với dữ liệu đã được tải trước khi thử nghiệm, khi ảnh chụp nhanh trước đó được chụp. Tương tự, mô-đun linecache đã lưu vào bộ nhớ đệm 940 KiB của mã nguồn Python để định dạng các truy nguyên, tất cả đều kể từ ảnh chụp nhanh trước đó.
Nếu hệ thống có ít bộ nhớ trống, ảnh chụp nhanh có thể được ghi vào đĩa bằng phương pháp Snapshot.dump() để phân tích ảnh chụp nhanh ngoại tuyến. Sau đó sử dụng phương pháp Snapshot.load() tải lại ảnh chụp nhanh.
Lấy dấu vết của khối bộ nhớ¶
Mã để hiển thị truy nguyên của khối bộ nhớ lớn nhất:
nhập khẩu tracemalloc
# Store 25 khung hình
tracemalloc.start(25)
# ... chạy ứng dụng của bạn ...
ảnh chụp nhanh = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')
# pick khối bộ nhớ lớn nhất
stat = top_stats[0]
print("%s khối bộ nhớ: %.1f KiB" % (stat.count, stat.size / 1024))
cho dòng trong stat.traceback.format():
in (dòng)
Ví dụ về đầu ra của bộ thử nghiệm Python (truy ngược giới hạn ở 25 khung):
903 khối bộ nhớ: 870,1 KiB
Tệp "<frozen importlib._bootstrap>", dòng 716
Tệp "<frozen importlib._bootstrap>", dòng 1036
Tệp "<frozen importlib._bootstrap>", dòng 934
Tệp "<frozen importlib._bootstrap>", dòng 1068
Tệp "<frozen importlib._bootstrap>", dòng 619
Tệp "<frozen importlib._bootstrap>", dòng 1581
Tệp "<frozen importlib._bootstrap>", dòng 1614
Tệp "/usr/lib/python3.4/doctest.py", dòng 101
nhập pdb
Tệp "<frozen importlib._bootstrap>", dòng 284
Tệp "<frozen importlib._bootstrap>", dòng 938
Tệp "<frozen importlib._bootstrap>", dòng 1068
Tệp "<frozen importlib._bootstrap>", dòng 619
Tệp "<frozen importlib._bootstrap>", dòng 1581
Tệp "<frozen importlib._bootstrap>", dòng 1614
Tệp "/usr/lib/python3.4/test/support/__init__.py", dòng 1728
nhập doctest
Tệp "/usr/lib/python3.4/test/test_pickletools.py", dòng 21
support.run_doctest(pickletools)
Tệp "/usr/lib/python3.4/test/regrtest.py", dòng 1276
test_runner()
Tệp "/usr/lib/python3.4/test/regrtest.py", dòng 976
display_failure=không dài dòng)
Tệp "/usr/lib/python3.4/test/regrtest.py", dòng 761
match_tests=ns.match_tests)
Tệp "/usr/lib/python3.4/test/regrtest.py", dòng 1563
chính()
Tệp "/usr/lib/python3.4/test/__main__.py", dòng 3
regrtest.main_in_temp_cwd()
Tệp "/usr/lib/python3.4/runpy.py", dòng 73
exec(mã, run_globals)
Tệp "/usr/lib/python3.4/runpy.py", dòng 160
"__main__", fname, bộ nạp, pkg_name)
Chúng ta có thể thấy rằng hầu hết bộ nhớ đã được phân bổ trong mô-đun importlib để tải dữ liệu (mã byte và hằng số) từ các mô-đun: 870.1 KiB. Truy nguyên là nơi importlib tải dữ liệu gần đây nhất: trên dòng import pdb của mô-đun doctest. Truy nguyên có thể thay đổi nếu một mô-đun mới được tải.
Khá đỉnh¶
Mã hiển thị 10 dòng phân bổ nhiều bộ nhớ nhất với đầu ra đẹp, bỏ qua các tệp <frozen importlib._bootstrap> và <unknown>
nhập linecache
hệ điều hành nhập khẩu
nhập khẩu tracemalloc
def display_top(snapshot, key_type='lineno', limit=10):
ảnh chụp nhanh = snapshot.filter_traces((
tracemalloc.Filter(Sai, "<frozen importlib._bootstrap>"),
tracemalloc.Filter(Sai, "<không xác định>"),
))
top_stats = ảnh chụp nhanh.statistic(key_type)
print("Giới hạn %s dòng trên cùng" %)
đối với chỉ mục, stat trong enumerate(top_stats[:limit], 1):
khung = stat.traceback[0]
print("#%s: %s:%s: %.1f KiB"
% (chỉ mục, frame.filename, frame.lineno, stat.size / 1024))
line = linecache.getline(frame.filename, frame.lineno).strip()
nếu dòng:
in(' %s' % dòng)
khác = top_stats[giới hạn:]
nếu khác:
size = sum(stat.size cho stat khác)
print("%s other: %.1f KiB" % (len(other), size / 1024))
tổng = sum(stat.size cho stat trong top_stats)
print("Tổng kích thước được phân bổ: %.1f KiB" % (tổng / 1024))
tracemalloc.start()
# ... chạy ứng dụng của bạn ...
ảnh chụp nhanh = tracemalloc.take_snapshot()
display_top(ảnh chụp nhanh)
Ví dụ về đầu ra của bộ thử nghiệm Python:
10 dòng hàng đầu
#1: Lib/base64.py:414: 419,8 KiB
_b85chars2 = [(a + b) cho a trong _b85chars cho b trong _b85chars]
#2: Lib/base64.py:306: 419,8 KiB
_a85chars2 = [(a + b) cho a trong _a85chars cho b trong _a85chars]
#3: bộ sưu tập/__init__.py:368: 293,6 KiB
exec(class_def định, không gian tên)
#4: Lib/abc.py:133: 115,2 KiB
cls = super().__new__(mcls, tên, căn cứ, không gian tên)
#5: unittest/case.py:574: 103.1 KiB
phương thức kiểm tra()
#6: Lib/linecache.py:127: 95,4 KiB
dòng = fp.readlines()
#7: urllib/parse.py:476: 71,8 KiB
cho a trong _hexdig cho b trong _hexdig}
#8: <string>:5: 62.0 KiB
#9: Lib/_weakrefset.py:37: 60.0 KiB
self.data = set()
#10: Lib/base64.py:142: 59,8 KiB
_b32tab2 = [a + b cho a trong _b32tab cho b trong _b32tab]
6220 khác: 3602,8 KiB
Tổng kích thước được phân bổ: 5303,1 KiB
Xem Snapshot.statistics() để có thêm lựa chọn.
Ghi lại kích thước hiện tại và kích thước tối đa của tất cả các khối bộ nhớ được theo dõi¶
Đoạn mã sau tính hai tổng như 0 + 1 + 2 + ... không hiệu quả bằng cách tạo danh sách các số đó. Danh sách này tạm thời tiêu tốn rất nhiều bộ nhớ. Chúng ta có thể sử dụng get_traced_memory() và reset_peak() để quan sát mức sử dụng bộ nhớ nhỏ sau khi tính tổng cũng như mức sử dụng bộ nhớ cao nhất trong quá trình tính toán:
nhập khẩu tracemalloc
tracemalloc.start()
Mã # Example: tính tổng với danh sách tạm thời lớn
big_sum = tổng (danh sách (phạm vi (100000)))
first_size, first_peak = tracemalloc.get_traced_memory()
tracemalloc.reset_peak()
Mã # Example: tính tổng với một danh sách tạm thời nhỏ
Small_sum = tổng (danh sách (phạm vi (1000)))
giây_size, giây_peak = tracemalloc.get_traced_memory()
print(f"{first_size=}, {first_peak=}")
print(f"{second_size=}, {second_peak=}")
Đầu ra:
first_size=664, first_peak=3592984
giây_size=804, giây_peak=29704
Việc sử dụng reset_peak() đảm bảo chúng tôi có thể ghi lại mức cao nhất trong quá trình tính toán small_sum, mặc dù nó nhỏ hơn nhiều so với kích thước tối đa tổng thể của các khối bộ nhớ kể từ lệnh gọi start(). Nếu không gọi tới reset_peak(), second_peak vẫn sẽ là đỉnh của phép tính large_sum (nghĩa là bằng first_peak). Trong trường hợp này, cả hai mức cao nhất đều cao hơn nhiều so với mức sử dụng bộ nhớ cuối cùng và điều này cho thấy chúng ta có thể tối ưu hóa (bằng cách xóa lệnh gọi không cần thiết tới list và ghi sum(range(...))).
API¶
Chức năng¶
- tracemalloc.get_object_traceback(obj)¶
Lấy dấu vết nơi đối tượng Python obj được phân bổ. Trả về phiên bản
TracebackhoặcNonenếu mô-đuntracemallockhông theo dõi quá trình phân bổ bộ nhớ hoặc không theo dõi quá trình phân bổ đối tượng.Xem thêm các hàm
gc.get_referrers()vàsys.getsizeof().
- tracemalloc.get_traceback_limit()¶
Lấy số lượng khung hình tối đa được lưu trữ trong traceback của một dấu vết.
Mô-đun
tracemallocphải theo dõi việc phân bổ bộ nhớ để đạt giới hạn, nếu không sẽ xuất hiện ngoại lệ.Giới hạn được đặt bởi chức năng
start().
- tracemalloc.get_traced_memory()¶
Lấy kích thước hiện tại và kích thước tối đa của các khối bộ nhớ được mô-đun
tracemalloctheo dõi dưới dạng một bộ dữ liệu:(current: int, peak: int).
- tracemalloc.reset_peak()¶
Đặt kích thước tối đa của các khối bộ nhớ được mô-đun
tracemalloctheo dõi theo kích thước hiện tại.Không làm gì nếu mô-đun
tracemallockhông theo dõi việc phân bổ bộ nhớ.Chức năng này chỉ sửa đổi kích thước đỉnh đã ghi và không sửa đổi hoặc xóa bất kỳ dấu vết nào, không giống như
clear_traces(). Các ảnh chụp nhanh được chụp bằngtake_snapshot()trước cuộc gọi tớireset_peak()có thể được so sánh một cách có ý nghĩa với các ảnh chụp nhanh được chụp sau cuộc gọi.Xem thêm
get_traced_memory().Added in version 3.9.
- tracemalloc.get_tracemalloc_memory()¶
Nhận mức sử dụng bộ nhớ theo byte của mô-đun
tracemallocđược sử dụng để lưu trữ dấu vết của các khối bộ nhớ. Trả vềint.
- tracemalloc.is_tracing()¶
Truenếu mô-đuntracemallocđang theo dõi phân bổ bộ nhớ Python, nếu không thìFalse.
- tracemalloc.start(nframe: int = 1)¶
Bắt đầu theo dõi phân bổ bộ nhớ Python: cài đặt hook trên bộ cấp phát bộ nhớ Python. Các dấu vết được thu thập sẽ bị giới hạn ở các khung nframe. Theo mặc định, dấu vết của khối bộ nhớ chỉ lưu trữ khung hình gần đây nhất: giới hạn là
1. nframe phải lớn hơn hoặc bằng1.Bạn vẫn có thể đọc tổng số khung hình ban đầu tạo nên truy nguyên bằng cách xem thuộc tính
Traceback.total_nframe.Việc lưu trữ nhiều hơn khung
1chỉ hữu ích để tính toán số liệu thống kê được nhóm theo'traceback'hoặc để tính số liệu thống kê tích lũy: xem các phương phápSnapshot.compare_to()vàSnapshot.statistics().Việc lưu trữ nhiều khung hình hơn sẽ tăng bộ nhớ và chi phí sử dụng CPU của mô-đun
tracemalloc. Sử dụng chức năngget_tracemalloc_memory()để đo lượng bộ nhớ được mô-đuntracemallocsử dụng.Biến môi trường
PYTHONTRACEMALLOC(PYTHONTRACEMALLOC=NFRAME) và tùy chọn dòng lệnh-Xtracemalloc=NFRAMEcó thể được sử dụng để bắt đầu theo dõi khi khởi động.Xem thêm các hàm
stop(),is_tracing()vàget_traceback_limit().
- tracemalloc.stop()¶
Dừng theo dõi phân bổ bộ nhớ Python: gỡ cài đặt hook trên bộ cấp phát bộ nhớ Python. Đồng thời xóa tất cả dấu vết đã thu thập trước đó của các khối bộ nhớ do Python phân bổ.
Gọi hàm
take_snapshot()để chụp ảnh nhanh các dấu vết trước khi xóa chúng.Xem thêm các hàm
start(),is_tracing()vàclear_traces().
- tracemalloc.take_snapshot()¶
Chụp ảnh nhanh dấu vết của các khối bộ nhớ được Python phân bổ. Trả về một phiên bản
Snapshotmới.Ảnh chụp nhanh không bao gồm các khối bộ nhớ được phân bổ trước khi mô-đun
tracemallocbắt đầu theo dõi quá trình phân bổ bộ nhớ.Việc truy nguyên dấu vết được giới hạn ở các khung
get_traceback_limit(). Sử dụng tham số nframe của hàmstart()để lưu trữ nhiều khung hình hơn.Mô-đun
tracemallocphải theo dõi việc phân bổ bộ nhớ để chụp ảnh nhanh, xem chức năngstart().Xem thêm chức năng
get_object_traceback().
Bộ lọc tên miền¶
- class tracemalloc.DomainFilter(inclusive: bool, domain: int)¶
Lọc dấu vết của khối bộ nhớ theo không gian địa chỉ (miền) của chúng.
Added in version 3.6.
- inclusive¶
Nếu inclusive là
True(bao gồm), hãy khớp các khối bộ nhớ được phân bổ trong không gian địa chỉdomain.Nếu inclusive là
False(loại trừ), hãy khớp các khối bộ nhớ không được phân bổ trong không gian địa chỉdomain.
- domain¶
Không gian địa chỉ của khối bộ nhớ (
int). Thuộc tính chỉ đọc.
Lọc¶
- class tracemalloc.Filter(inclusive: bool, filename_pattern: str, lineno: int = None, all_frames: bool = False, domain: int = None)¶
Lọc dấu vết của khối bộ nhớ.
Xem hàm
fnmatch.fnmatch()để biết cú pháp của filename_pattern. Phần mở rộng tệp'.pyc'được thay thế bằng'.py'.Ví dụ:
Filter(True, subprocess.__file__)chỉ bao gồm dấu vết của mô-đunsubprocessFilter(False, tracemalloc.__file__)loại trừ dấu vết của mô-đuntracemallocFilter(False, "<unknown>")loại trừ các dấu vết trống
Thay đổi trong phiên bản 3.5: Phần mở rộng tệp
'.pyo'không còn được thay thế bằng'.py'nữa.Thay đổi trong phiên bản 3.6: Đã thêm thuộc tính
domain.- domain¶
Không gian địa chỉ của khối bộ nhớ (
inthoặcNone).tracemalloc sử dụng miền
0để theo dõi quá trình phân bổ bộ nhớ do Python thực hiện. Tiện ích mở rộng C có thể sử dụng các tên miền khác để theo dõi các tài nguyên khác.
- inclusive¶
Nếu inclusive là
True(bao gồm), chỉ khớp các khối bộ nhớ được phân bổ trong một tệp có tên khớp vớifilename_patternở số dònglineno.Nếu inclusive là
False(loại trừ), hãy bỏ qua các khối bộ nhớ được phân bổ trong một tệp có tên khớp vớifilename_patternở số dònglineno.
- lineno¶
Số dòng (
int) của bộ lọc. Nếu lineno làNone, bộ lọc sẽ khớp với bất kỳ số dòng nào.
- filename_pattern¶
Mẫu tên tệp của bộ lọc (
str). Thuộc tính chỉ đọc.
- all_frames¶
Nếu all_frames là
True, tất cả các khung của truy nguyên đều được kiểm tra. Nếu all_frames làFalsethì chỉ khung gần đây nhất mới được chọn.Thuộc tính này không có hiệu lực nếu giới hạn truy nguyên là
1. Xem hàmget_traceback_limit()và thuộc tínhSnapshot.traceback_limit.
khung¶
Ảnh chụp nhanh¶
- class tracemalloc.Snapshot¶
Ảnh chụp nhanh dấu vết của các khối bộ nhớ được Python phân bổ.
Hàm
take_snapshot()tạo một phiên bản chụp nhanh.- compare_to(old_snapshot: Snapshot, key_type: str, cumulative: bool = False)¶
Tính toán sự khác biệt với ảnh chụp nhanh cũ. Nhận số liệu thống kê dưới dạng danh sách được sắp xếp của các phiên bản
StatisticDiffđược nhóm theo key_type.Xem phương pháp
Snapshot.statistics()để biết các tham số key_type và cumulative.Kết quả được sắp xếp từ lớn nhất đến nhỏ nhất theo: giá trị tuyệt đối của
StatisticDiff.size_diff,StatisticDiff.size, giá trị tuyệt đối củaStatisticDiff.count_diff,Statistic.countvà sau đó làStatisticDiff.traceback.
- filter_traces(filters)¶
Tạo một phiên bản
Snapshotmới với chuỗitracesđược lọc, filters là danh sách các phiên bảnDomainFiltervàFilter. Nếu filters là danh sách trống, hãy trả về phiên bảnSnapshotmới cùng với bản sao của dấu vết.Tất cả các bộ lọc bao gồm được áp dụng cùng một lúc, dấu vết sẽ bị bỏ qua nếu không có bộ lọc bao gồm nào phù hợp với nó. Một dấu vết sẽ bị bỏ qua nếu có ít nhất một bộ lọc độc quyền phù hợp với nó.
Thay đổi trong phiên bản 3.6: Phiên bản
DomainFilterhiện cũng được chấp nhận trong filters.
- statistics(key_type: str, cumulative: bool = False)¶
Nhận số liệu thống kê dưới dạng danh sách được sắp xếp của các phiên bản
Statisticđược nhóm theo key_type:key_type
mô tả
'filename'tên tập tin
'lineno'tên tập tin và số dòng
'traceback'truy nguyên
Nếu cumulative là
True, hãy tính kích thước và số lượng khối bộ nhớ của tất cả các khung hình theo dõi dấu vết, không chỉ khung hình gần đây nhất. Chế độ tích lũy chỉ có thể được sử dụng với key_type bằng'filename'và'lineno'.Kết quả được sắp xếp từ lớn nhất đến nhỏ nhất theo:
Statistic.size,Statistic.countvà sau đó làStatistic.traceback.
- traceback_limit¶
Số lượng khung hình tối đa được lưu trữ trong truy nguyên của
traces: kết quả củaget_traceback_limit()khi chụp ảnh nhanh.
- traces¶
Dấu vết của tất cả các khối bộ nhớ được Python phân bổ: chuỗi các phiên bản
Trace.Trình tự có thứ tự không xác định. Sử dụng phương pháp
Snapshot.statistics()để lấy danh sách thống kê được sắp xếp.
Thống kê¶
- class tracemalloc.Statistic¶
Thống kê về phân bổ bộ nhớ.
Snapshot.statistics()trả về danh sách các phiên bảnStatistic.Xem thêm lớp
StatisticDiff.- count¶
Số khối bộ nhớ (
int).
- size¶
Tổng kích thước của khối bộ nhớ tính bằng byte (
int).
Thống kê khác biệt¶
- class tracemalloc.StatisticDiff¶
Sự khác biệt thống kê về phân bổ bộ nhớ giữa phiên bản
Snapshotcũ và mới.Snapshot.compare_to()trả về danh sách các phiên bảnStatisticDiff. Xem thêm lớpStatistic.- count¶
Số khối bộ nhớ trong ảnh chụp nhanh mới (
int):0nếu khối bộ nhớ đã được giải phóng trong ảnh chụp nhanh mới.
- count_diff¶
Sự khác biệt về số khối bộ nhớ giữa ảnh chụp nhanh cũ và ảnh chụp nhanh mới (
int):0nếu khối bộ nhớ đã được phân bổ trong ảnh chụp nhanh mới.
- size¶
Tổng kích thước của khối bộ nhớ tính bằng byte trong ảnh chụp nhanh mới (
int):0nếu khối bộ nhớ đã được giải phóng trong ảnh chụp nhanh mới.
- size_diff¶
Sự khác biệt về tổng kích thước của các khối bộ nhớ tính bằng byte giữa ảnh chụp nhanh cũ và ảnh chụp nhanh mới (
int):0nếu các khối bộ nhớ đã được phân bổ trong ảnh chụp nhanh mới.
Dấu vết¶
- class tracemalloc.Trace¶
Dấu vết của một khối bộ nhớ.
Thuộc tính
Snapshot.traceslà một chuỗi các phiên bảnTrace.Thay đổi trong phiên bản 3.6: Đã thêm thuộc tính
domain.- domain¶
Không gian địa chỉ của khối bộ nhớ (
int). Thuộc tính chỉ đọc.tracemalloc sử dụng miền
0để theo dõi quá trình phân bổ bộ nhớ do Python thực hiện. Tiện ích mở rộng C có thể sử dụng các tên miền khác để theo dõi các tài nguyên khác.
- size¶
Kích thước của khối bộ nhớ tính bằng byte (
int).
Truy nguyên¶
- class tracemalloc.Traceback¶
Trình tự các phiên bản
Frameđược sắp xếp từ khung hình cũ nhất đến khung hình gần đây nhất.Một traceback chứa ít nhất khung
1. Nếu mô-đuntracemallockhông lấy được khung, tên tệp"<unknown>"ở số dòng0sẽ được sử dụng.Khi chụp ảnh nhanh, việc truy nguyên dấu vết được giới hạn ở các khung
get_traceback_limit(). Xem chức năngtake_snapshot(). Số lượng khung hình ban đầu của truy nguyên được lưu trữ trong thuộc tínhTraceback.total_nframe. Điều đó cho phép người ta biết liệu một truy nguyên có bị cắt bớt bởi giới hạn truy nguyên hay không.Thuộc tính
Trace.tracebacklà một phiên bảnTraceback.Thay đổi trong phiên bản 3.7: Các khung giờ đây được sắp xếp từ khung cũ nhất đến khung mới nhất, thay vì gần đây nhất đến cũ nhất.
- total_nframe¶
Tổng số khung hình tạo nên truy nguyên trước khi cắt bớt. Thuộc tính này có thể được đặt thành
Nonenếu không có thông tin.
Thay đổi trong phiên bản 3.9: Thuộc tính
Traceback.total_nframeđã được thêm vào.- format(limit=None, most_recent_first=False)¶
Định dạng truy nguyên dưới dạng danh sách các dòng. Sử dụng mô-đun
linecacheđể truy xuất các dòng từ mã nguồn. Nếu limit được đặt, hãy định dạng khung hình gần đây nhất của limit nếu limit là dương. Nếu không, hãy định dạng các khung hình cũ nhất củaabs(limit). Nếu most_recent_first làTrue, thứ tự của các khung được định dạng sẽ bị đảo ngược, trả về khung hình gần đây nhất trước thay vì cuối cùng.Tương tự như hàm
traceback.format_tb(), ngoại trừformat()không bao gồm dòng mới.Ví dụ:
print("Traceback (cuộc gọi gần đây nhất trước):") cho dòng trong traceback: in (dòng)
Đầu ra:
Traceback (cuộc gọi gần đây nhất trước): Tệp "test.py", dòng 9 obj = Đối tượng() Tệp "test.py", dòng 12 tb = tracemalloc.get_object_traceback(f())