簡體   English   中英

在 python 中,為什么引發相同的異常比拋出新的異常需要更多的內存?

[英]In python why does raising the same exception take more memory than throwing a new exception?

當我遇到一些似乎違反直覺的內存使用時,我正在分析一些引發異常的代碼,以確定兩種方法中的哪一種更好。 也許有人可以闡明一些觀點。 下面的 Test1 引發了 10K 次新異常。 與引發相同的異常 10K 次相比,它占用的內存更少。 ???

蟒蛇 3.9

from memory_profiler import profile

TEST_COUNT = 10000


class ApplicationException(Exception):
    def __init__(self):
        self.code = 0

@profile
def test1():
    for x in range(TEST_COUNT):
        try:
            raise ApplicationException()
        except:
            pass


@profile
def test2():
    application_exception = ApplicationException()
    for x in range(TEST_COUNT):
        try:
            raise application_exception
        except:
            pass


test1()
test2()

結果是:

Line #    Mem usage    Increment  Occurences   Line Contents
_____________________________________________________________
    10     14.1 MiB     14.1 MiB           1   @profile
    11                                         def test1():
    12     14.1 MiB      0.0 MiB       10001       for x in range(TEST_COUNT):
    13     14.1 MiB      0.0 MiB       10000           try:
    14     14.1 MiB      0.0 MiB       10000               raise ApplicationException()
    15     14.1 MiB      0.0 MiB       10000           except:
    16     14.1 MiB      0.0 MiB       10000               pass
Line #    Mem usage    Increment  Occurences   Line Contents
_____________________________________________________________
    19     14.2 MiB     14.2 MiB           1   @profile
    20                                         def test2():
    21     14.2 MiB      0.0 MiB           1       application_exception = ApplicationException()
    22     14.7 MiB      0.0 MiB       10001       for x in range(TEST_COUNT):
    23     14.7 MiB      0.0 MiB       10000           try:
    24     14.7 MiB      0.5 MiB       10000               raise application_exception
    25     14.7 MiB      0.0 MiB       10000           except:
    26     14.7 MiB      0.0 MiB       10000               pass

不知道這里發生了什么。 第 24 行會產生一些內存開銷。 有人可以解釋一下嗎?

在第一個測試中,您正在引發ApplicationException類的一個新實例,但您沒有為其分配任何變量

但是,在第二個測試中,您將ApplicationException實例分配給一個變量,而不是引發它。 分配的變量有額外的信息,如名稱等。 所以,它使用更多的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM