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 )

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 )

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(, 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><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()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()

 # 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()

 # 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.clear_traces()

Xóa dấu vết của các khối bộ nhớ do Python phân bổ.

Xem thêm stop().

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 Traceback hoặc None nếu mô-đun tracemalloc khô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()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 tracemalloc phả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 tracemalloc theo 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 tracemalloc theo dõi theo kích thước hiện tại.

Không làm gì nếu mô-đun tracemalloc khô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ằng take_snapshot() trước cuộc gọi tới reset_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()

True nếu mô-đun tracemalloc đang theo dõi phân bổ bộ nhớ Python, nếu không thì False.

Xem thêm các hàm start()stop().

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

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 1 chỉ 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áp Snapshot.compare_to()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ăng get_tracemalloc_memory() để đo lượng bộ nhớ được mô-đun tracemalloc sử dụng.

Biến môi trường PYTHONTRACEMALLOC (PYTHONTRACEMALLOC=NFRAME) và tùy chọn dòng lệnh -X tracemalloc=NFRAME có 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()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()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 Snapshot mớ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 tracemalloc bắ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àm start() để lưu trữ nhiều khung hình hơn.

Mô-đun tracemalloc phải theo dõi việc phân bổ bộ nhớ để chụp ảnh nhanh, xem chức năng start().

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 inclusiveTrue (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 inclusiveFalse (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ô-đun subprocess

  • Filter(False, tracemalloc.__file__) loại trừ dấu vết của mô-đun tracemalloc

  • Filter(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ớ (int hoặc None).

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 inclusiveTrue (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ới filename_pattern ở số dòng lineno.

Nếu inclusiveFalse (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ới filename_pattern ở số dòng lineno.

lineno

Số dòng (int) của bộ lọc. Nếu linenoNone, 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_framesTrue, tất cả các khung của truy nguyên đều được kiểm tra. Nếu all_framesFalse thì 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àm get_traceback_limit() và thuộc tính Snapshot.traceback_limit.

khung

class tracemalloc.Frame

Khung truy nguyên.

Lớp Traceback là một chuỗi các phiên bản Frame.

filename

Tên tệp (str).

lineno

Số dòng (int).

Ả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_typecumulative.

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ủa StatisticDiff.count_diff, Statistic.count và sau đó là StatisticDiff.traceback.

dump(filename)

Viết ảnh chụp nhanh vào một tập tin.

Sử dụng load() để tải lại ảnh chụp nhanh.

filter_traces(filters)

Tạo một phiên bản Snapshot mới với chuỗi traces được lọc, filters là danh sách các phiên bản DomainFilterFilter. Nếu filters là danh sách trống, hãy trả về phiên bản Snapshot mớ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 DomainFilter hiện cũng được chấp nhận trong filters.

classmethod load(filename)

Tải ảnh chụp nhanh từ một tập tin.

Xem thêm dump().

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 cumulativeTrue, 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''lineno'.

Kết quả được sắp xếp từ lớn nhất đến nhỏ nhất theo: Statistic.size, Statistic.count và 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ủa get_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ản Statistic.

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).

traceback

Traceback nơi khối bộ nhớ được phân bổ, phiên bản Traceback.

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 Snapshot cũ và mới.

Snapshot.compare_to() trả về danh sách các phiên bản StatisticDiff. Xem thêm lớp Statistic.

count

Số khối bộ nhớ trong ảnh chụp nhanh mới (int): 0 nế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): 0 nế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): 0 nế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): 0 nếu các khối bộ nhớ đã được phân bổ trong ảnh chụp nhanh mới.

traceback

TracBack nơi các khối bộ nhớ được phân bổ, phiên bản Traceback.

Dấu vết

class tracemalloc.Trace

Dấu vết của một khối bộ nhớ.

Thuộc tính Snapshot.traces là một chuỗi các phiên bản Trace.

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).

traceback

Traceback nơi khối bộ nhớ được phân bổ, phiên bản Traceback.

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ô-đun tracemalloc không lấy được khung, tên tệp "<unknown>" ở số dòng 0 sẽ đượ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ăng take_snapshot(). Số lượng khung hình ban đầu của truy nguyên được lưu trữ trong thuộc tính Traceback.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.traceback là một phiên bản Traceback.

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 None nế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ủa abs(limit). Nếu most_recent_firstTrue, 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())