28.01.2015 Views

Tutorial Python - Starship

Tutorial Python - Starship

Tutorial Python - Starship

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

11.6 Legături slabe la memorie<br />

Pentru fiecare obiect, <strong>Python</strong> realizează o legătura a acestuia cu memorie.Legătura poate fi puternică (permanentă),<br />

sau slabă (de scurtă durată). Aceste legături sunt administrate în mod automat, prin contorizarea legăturilor<br />

obiectelor şi prin folosirea "coşului de gunoi" pentru eliminarea ciclurilor.Memoria este eliberată imediat ce ultima<br />

referire la ea a fost eliminată.<br />

Acest comportament funcţionează bine pentru majoritatea aplicaţiilor, dar uneori se doreşte să se urmărească<br />

obiectele doar atât timp cât sunt utilizate de altă aplicaţie.Din păcate această urmărire produce o legătură permanentă<br />

la memorie.Modulul weackref oferă instrumente pentru urmărirea obiectelor prin crearea unor legături<br />

slabe. Când un biect nu mai este necesar va fi automat eliminat din tabela de legături slabe.<br />

>>> import weakref, gc<br />

>>> class A:<br />

... def __init__(self, value):<br />

... self.value = value<br />

... def __repr__(self):<br />

... return str(self.value)<br />

...<br />

>>> a = A(10) # creaza o legatura<br />

>>> d = weakref.WeakValueDictionary()<br />

>>> d[’primary’] = a # nu creaza legatura<br />

>>> d[’primary’] # fetch the object if it is still alive<br />

10<br />

>>> del a # elimina o referinta<br />

>>> gc.collect() # activeaza "cosul de gunoi"<br />

0<br />

>>> d[’primary’] # intrarea a fost eliminata automat<br />

Traceback (most recent call last):<br />

File "", line 1, in -topleveld[’primary’]<br />

# entry was automatically removed<br />

File "C:/PY24/lib/weakref.py", line 46, in __getitem__<br />

o = self.data[key]()<br />

KeyError: ’primary’<br />

11.7 Instrumente de lucru cu listele<br />

Multe structuri de date se contruiesc cu ajutorul listelor predefinite.Oricum, uneori se impune necesitatea unei<br />

implementări alternative cu performanţe diferite de cele obişnuite.<br />

Modulul array oferă obiectul array() care se comporta ca o listă care cuprinde numai obiecte de acelaşi fel,<br />

dar care sunt stocate mai compact decât în cazul listei standard.În următorul exemplu se prezintă cum un array 1 de<br />

numere memorate ca numere binare făra semn reprezentate pe doi octeţi (cod de tip "H") este contrapus utilizării<br />

unei liste standard de obiecte <strong>Python</strong> de tip int, reprezentate pe 16 octeţi :<br />

>>> from array import array<br />

>>> a = array(’H’, [4000, 10, 700, 22222])<br />

>>> sum(a)<br />

26932<br />

>>> a[1:3]<br />

array(’H’, [10, 700])<br />

Modulul collection conţine obiectul deque() care se aseamănaă cu tipul listă, cu adăugări si scoateri rapide<br />

de elemente prin stânga, dar cu o accesarea lentă a mijlocului.Aceste obiecte sunt convenabile pentru implementarea<br />

cozilor şi a cautării pe nivel pentru arbori :<br />

1 Array = Lista cu valori de acelaşi tip care se pot referi individual<br />

11.6. Legături slabe la memorie 79

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!