Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah perbezaan antara pembolehubah kelewatan dan senarai terpaut free_list dalam Python3?

Apakah perbezaan antara pembolehubah kelewatan dan senarai terpaut free_list dalam Python3?

WBOY
WBOYke hadapan
2023-04-23 13:52:161239semak imbas

1. Konsep

1. Perbezaan

Dalam Python3, "pembolehubah kelewatan" dan "senarai terpaut percuma" ialah dua konsep yang berbeza, dan tiada hubungan langsung antara mereka.

2. Pembolehubah kelewatan (Penilaian malas)

Pembolehubah kelewatan bermakna dalam sesetengah kes, Python tidak akan segera mengira nilai ungkapan, tetapi tunggu sehingga nilai diperlukan semasa melakukan pengiraan. Pendekatan ini dipanggil "penilaian malas" atau "penilaian tertunda".

Contohnya: penjana ialah kaedah pengiraan tertunda.

Apabila objek penjana dicipta, ia tidak akan menjana semua nilai serta-merta, tetapi satu demi satu kelebihan pendekatan ini ialah: menjimatkan ruang memori dan sumber pengkomputeran

3. senarai terpaut free_list

Senarai terpaut free_list ialah mekanisme pengurusan memori dalam Python3. Mekanisme pengumpulan sampah digunakan untuk mengurus ruang memori secara automatik Senarai terpaut free_list ialah mekanisme yang boleh menggunakan semula blok memori yang diperuntukkan tetapi tidak digunakan.

Apabila objek baharu dicipta, Python memperuntukkan ruang memori dan menandakannya sebagai digunakan. Apabila objek tidak lagi dirujuk, Python secara automatik menandakannya sebagai tidak digunakan dan menambahkannya ke free_list. Apabila objek dicipta pada masa akan datang, Python akan terlebih dahulu menyemak sama ada terdapat blok memori boleh guna semula dalam senarai terpaut free_list, dengan itu mengelakkan peruntukan memori yang tidak perlu dan operasi pelepasan.

2. Contoh

1. Contoh pembolehubah kelewatan

Dalam contoh ini, fungsi penjana fibonacci() ditakrifkan untuk melaksanakan Fibonacci Logik penjanaan jujukan akta . Apabila kita mencipta objek penjana fib, ia tidak akan menjana semua nilai jujukan Fibonacci sekali gus, tetapi satu demi satu apabila diperlukan. Di sini, kami menggunakan fungsi next() untuk mendapatkan nilai jujukan Fibonacci seterusnya.

# 定义一个生成器,实现斐波那契数列
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 linked list

Dalam contoh ini, kita mula-mula mencipta dua objek senarai yang sama a dan b dan mencetak alamat memori mereka. Kami kemudian mengeluarkan objek a daripada memori dan menggunakan gc.collect() untuk memaksa kutipan sampah. Seterusnya, kami mencipta objek senarai baharu c dan mencetak alamat memorinya. Akhir sekali, kami menggunakan fungsi sys.getsizeof([]) untuk menyemak sama ada terdapat blok memori boleh guna semula dalam senarai 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() boleh memaksa kutipan sampah, tetapi ini tidak bermakna memori itu akan segera Kosong. Pengurusan memori dalam Python diuruskan bersama oleh penterjemah dan sistem pengendalian Peruntukan memori khusus dan masa kitar semula juga dipengaruhi oleh pelbagai faktor, seperti algoritma pengumpul sampah, penggunaan memori sistem, dsb.

Dalam contoh di atas, apabila kita memadamkan objek a dan memanggil gc.collect() untuk pengumpulan sampah, penterjemah Python akan menandakan memori yang diduduki oleh objek a sebagai boleh dikitar semula dan akan Ia ditambahkan pada senarai pemungut sampah yang akan dikumpul. Walau bagaimanapun, ini tidak bermakna bahawa memori itu dituntut semula serta-merta, tetapi akan dibersihkan semasa pusingan seterusnya kutipan oleh pemungut sampah.

Selain itu, walaupun memori yang diduduki oleh objek a dikitar semula, ia tidak semestinya bermakna ruang memori dilepaskan serta-merta, kerana pengurusan memori dalam Python menggunakan mekanisme peruntukan tertunda, iaitu , hanya Apabila lebih banyak memori perlu diminta, Python akan meminta sistem pengendalian untuk memperuntukkan ruang memori baharu. Jadi, dalam contoh di atas, sementara ruang memori objek a mungkin telah dituntut semula, ruang memori itu mungkin masih dikhaskan oleh penterjemah Python untuk kegunaan masa hadapan, sekali gus mengelakkan peruntukan memori yang tidak perlu dan overhed deallocation.

Perlu diingat bahawa walaupun alamat memori bagi tiga objek a, b dan c tidak bertindih, ia tidak bermakna ruang memori yang mereka duduki tidak akan bertindih. Ini kerana kaedah pengurusan memori dalam Python diperuntukkan dan diuruskan dalam unit objek Ruang memori yang diduduki oleh setiap objek mungkin tidak berterusan, jadi ruang memori objek berbeza mungkin bertindih sebahagian.

Atas ialah kandungan terperinci Apakah perbezaan antara pembolehubah kelewatan dan senarai terpaut free_list dalam Python3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam