[英]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.