>> arr = numpy.frombuffer(buffer-6ren">
gpt4 book ai didi

arrays - Numpy 数组内存管理

转载 作者:行者123 更新时间:2023-12-04 18:45:47 28 4
gpt4 key购买 nike

我有一个关于 Numpy 数组内存管理的问题。假设我使用以下命令从缓冲区创建了一个 numpy 数组:

>>> s = "abcd"
>>> arr = numpy.frombuffer(buffer(s), dtype = numpy.uint8)
>>> arr.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : False
ALIGNED : True
UPDATEIFCOPY : False
>>> del s # What happens to arr?

在上述情况下,'arr' 是否包含对 's' 的引用?如果我删除“s”,这是否会释放为“s”分配的内存,从而使“arr”可能引用未分配的内存?

我还有一些其他问题:
  • 如果这是有效的,Python 如何知道何时释放由 's' 分配的内存? gc.get_referrents(arr) 函数似乎没有表明“arr”持有对“s”的引用。
  • 如果这是无效的,我如何才能将 's' 的引用注册到 'arr' 中,以便 Python GC 在所有对它的引用都消失时自动收割 's'?
  • 最佳答案

    以下应该澄清一些事情:

    >>> s = 'abcd'
    >>> arr = np.frombuffer(buffer(s), dtype='uint8')
    >>> arr.base
    <read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00>
    >>> del s
    >>> arr.base
    <read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03D1BA00>

    第一种情况 del s没有效果,因为数组指向的是 buffer从中创建,其他任何地方都没有引用。
    >>> t = buffer('abcd')
    >>> arr = np.frombuffer(t, dtype='uint8')
    >>> arr.base
    <read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920>
    >>> arr.base is t
    True
    >>> del t
    >>> arr.base
    <read-only buffer for 0x03D1BA60, size -1, offset 0 at 0x03C8D920>

    在第二种情况下,当您 del t ,你摆脱了变量 t指向 buffer对象,但因为数组仍然引用了相同的 buffer ,它不会被删除。虽然我不确定如何检查它,但如果您现在 del arr , buffer对象应该丢失它的最后一个引用并被自动垃圾收集。

    关于arrays - Numpy 数组内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14865075/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com