Python3中延时变量和free_list链表的区别解析

2023-05-15 14:05:26 变量 延时 python3

1、概念

1、区别

        在python3中,"延时变量" 和 "free_list链表" 是两个不同的概念,他们之间没有直接联系。

2、延时变量(Lazy evaluation)

        延时变量是指在某些情况下,python不会立即计算表达式的值,而是等到需要用到这个值的时候在进行计算。这种方式称为 "惰性计算" 或 "延时计算"。

      例如:生成器(generator)就是一种延时计算的方式。

当创建一个生成器对象时,它不会立即生成所有的值,而是在需要时逐个生成,这种方式的优点是:节省内存空间和计算资源

3. free_list链表

        free_list 链表 是Python3中的一个内存管理机制。采用了垃圾回收机制来自动管理内存空间,其中free_list链表是一种可以重复利用已经分配但未被使用的内存块的机制。

   当创建一个新对象时,Python会分配一块内存空间,并将其标记为已使用。当对象不在被引用时,Python会自动将其标记为未使用,并将其添加到free_list链表中。当下次创建对象时,Python会首先检查free_list链表中是否有可重复利用的内存块,从而避免不必要的内存分配和释放操作。

2、示例

1. 延时变量示例

        在这个示例中,定义了一个生成器函数 fibonacci(),实现了斐波那契数列的生成逻辑。当我们创建一个生成器对象 fib 时,它不会立即生成所有的斐波那契数列数值,而是在需要时逐个生成。在这里,我们使用了 next() 函数来获取下一个斐波那契数列数值。

# 定义一个生成器,实现斐波那契数列
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a , b = b, a+b
#创建一个生成器对象
fib = fibonacci()
#打印前 10 个斐波那契数列数值
for i in range(10):
    print(next(fib))
'''
执行结果如下:
0
1
1
2
3
5
8
13
21
34
'''

2.free_list链表

        在这个示例中,我们先创建了两个相同的列表对象 ab,并打印它们的内存地址。然后,我们将 a 对象从内存中删除,并使用 GC.collect() 强制进行垃圾回收。接着,我们创建了一个新的列表对象 c,并打印它的内存地址。最后,我们使用 sys.getsizeof([]) 函数检查 free_list 链表中是否有可重复利用的内存块

import sys
import gc
#创建两个相同的列表对象
a = [1, 2, 3]
b = [1, 2, 3]
#打印a和b对象的内存地址
print("a 的内存地址:", id(a))
print("b 的内存地址:", id(b))
#将a 对象从内存中删除
del a
# 创建一个新的列表对象 c
# 强制进行垃圾回收
gc.collect()
c = [1, 2, 3]
#打印 c 对象的内存地址
print("c 的内存地址:", id(c))
 
#检查 free_list 链表中是否有可重复利用的内存块
print("free_list 链表:", sys.getsizeof([]))
'''
执行结果如下:
a 的内存地址: 22203400
b 的内存地址: 22201928
c 的内存地址: 21904648
free_list 链表: 64
'''

    gc.collect() 可以强制进行垃圾回收,但并不意味着内存会立即被清空。Python 中的内存管理是由解释器和操作系统共同管理的,具体的内存分配和回收时机也受到多种因素的影响,如垃圾回收器算法、系统内存使用情况等。

     在上面的示例中,当我们删除 a 对象并调用 gc.collect() 进行垃圾回收时,Python 解释器会将 a 对象所占用的内存标记为可回收状态,并将其添加到垃圾回收器的待回收列表中。但是,这并不意味着内存立即被回收,而是在垃圾回收器的下一轮回收时才会被清理。

      另外,即使 a 对象所占用的内存被回收了,也不一定意味着该内存空间被立即释放,因为 Python 中的内存管理采用了一种延迟分配的机制,即只有当需要申请更多内存时,Python 才会向操作系统请求分配新的内存空间。因此,在上面的示例中,虽然 a 对象的内存空间可能已经被回收,但该内存空间可能仍然被 Python 解释器保留以供未来使用,从而避免不必要的内存分配和释放开销。

        需要注意的是,即使 abc 三个对象的内存地址不重复,也并不意味着它们占用的内存空间不会重叠。这是因为,Python 中的内存管理方式是以对象为单位进行分配和管理的,每个对象占用的内存空间可能是不连续的,因此不同对象的内存空间可能会部分重叠。

到此这篇关于Python3中延时变量和 free_list链表的区别的文章就介绍到这了,更多相关Python延时变量和 free_list链表内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章