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