繁体   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