• Aucun résultat trouvé

Représentation mémoire

N/A
N/A
Protected

Academic year: 2022

Partager "Représentation mémoire"

Copied!
56
0
0

Texte intégral

(1)

Représentation mémoire

Judicaël Courant

Lycée La Martinière-Monplaisir, Lyon

Le 18 novembre 2018

(2)

Introduction

Quelques subtilités de Python :

I Quelle est la différence entret += [1, 2] et t = t + [1, 2]?

I Que vaut M après les instructions

M = [[0] * 3] * 4 ; M[0][1] = 17 ?

I Que vaut u aprèsu = [1, 3, 2]; t = u; t.sort()?

I Et aprèsu = [1, 3, 2]; t = u; t = sorted(t) ?

(3)

Objectif

Être capable de prédire (correctement) le comportement de Python.

Pour cela, besoin de comprendre :

I La représentation des données en mémoire.

I Le phénomène d’aliasing.

(4)

Représentation des données en mémoire

I Un modèle simple permet de comprendre l’essentiel.

I Comme tous les modèles, c’est une représentationde la réalité, non la réalité elle-même.

(5)

Notre modèle

Mémoire vive Suite de cases numérotées de façon consécutive.

Aujourd’hui, 64 bits suffisent à représenter tous les numéros de cases possibles.

Adresse d’une case Son numéro.

Une case mémoire Contient 64 bits. Permet de coder l’adresse d’une autre case, ou quelques caractères.

NB : 232≈4×109, 264≈2×1019.

(6)

Les objets

Objets Nom donné aux données manipulées par Python.

Tas Partie de la mémoire où les objets sont stockés.

Représentation des objets Cases contiguës du tas codant :

I le type de l’objet ;

I ses données propres ;

I les adresses des autres objets auxquels il fait référence.

Adressed’un objet Adresse de sa première case mémoire.

(7)

Exemple

Représentation de

1 [ 51090942171709440000,

2 'bonjour tout le monde',

3 [42, 17]

4 ]

#200640 ENTIER 17

#48776

TABLEAU #201440

ENTIER 42

#452280 CHAÎNE bonjour tout le monde

#48520 TABLEAU

#44680 ENTIER 51090942171709440000

(8)

Les variables

I Les variablespermettent de désigner des objets.

I Elles sont stockées dans une partie de la mémoire appelée pile.

I Asymétrie : les objets ne peuvent pas désigner desvariables.

I Chaque variable contient une valeur.

(9)

Qu’est-ce qu’une valeur ?

Cela dépend des langages de programmation.

Scilab Valeur d’un objet = donnéescontenues dans l’objet.

Python Valeur d’un objet = adressede l’objet.

(10)

Conséquences

On suppose qu’on a exécutéu = [0] * (10**9) Que se passe t-il quand :

I On effectue l’affectationt = u ?

I On appelle f(u)avecdef f(t): return t[0]+t[1]? Scilab I Copie des données

I Coût : O(len(u))en temps et en espace Python I Copie d’une simple adresse

I Coût : O(1)en temps et en espace.

I Aliasing : deux variables peuvent désigner le même objet.

Pratique mais dangereux.

(11)

Règle d’or

En Python, unevaleurest juste l’adresse d’un objet.

Et les variables contiennent desvaleurs.

1 a = 123

2 b = 1789

3 t = ['hello', 'world']

PILE a b t

#204032 ENTIER 123

#648240 ENTIER 1789

#48456

TABLEAU #444232 CHAÎNE hello

#444344 CHAÎNE world

(12)

Aliasing

Deux variables peuvent désigner le même objet :

Après l’exécution de

1 u = t

uettsont alias l’un de l’autre.

#648240 ENTIER 1789

#48456

TABLEAU #444232 CHAÎNE hello

#444344 CHAÎNE world PILE

a b t u

#204032 ENTIER 123

(13)

Conséquence de l’aliasing

1 u[0] = 'bye!'

modifie l’objet désigné paru donc l’objet désigné part.

PILE a b t u

#204032 ENTIER 123

#648240 ENTIER 1789

#48456

TABLEAU #476216 CHAÎNE bye!

#444344 CHAÎNE world

(14)

Intérêt de l’aliasing

On peut écrire une fonction qui échange deux éléments d’un tableau:

1 def swap(u, i, j):

2 u[i], u[j] = u[j], u[i]

3

4 t = [ 11, 22, 33 ]

5 swap(t, 0, 1)

(impossible à écrire en Scilab)

Avant ligne 2

PILE t u i j

#7496 TABLEAU

#200096 ENTIER

0

#200128 ENTIER

1

#201152 ENTIER

33

#200448 ENTIER

11

#200800 ENTIER

22

(15)

Une distinction fondamentale

Ne pas confondre:

I Modifier une variable (faire qu’elle désigne un autre objet).

I Modifier un objet.

1 # Vélo : [ couleur, diam_roue_arr, retroviseur ]

2 peugeot = [ 'bleu', 30, False ]

3 azub = [ 'rouge', 26, True ]

4 monvelo = peugeot # en 1987

5 monvelo = azub # en 2009

6 monvelo[2] = False # en 2010

2009 j’ai changédevélo (modifié la variable) 2010 j’ai changémon vélo (modifié l’objet)

(16)

Des risques de l’aliasing

Modifier l’objet désigné par la variablex

I Change le contenu de l’objet désigné parx.

I Peut changer le contenu de l’objet désigné par une autre variable.

Exemple

1 x = [11, 22, 33]

2 y = [x, 42]

3 x.append(44) #201440

ENTIER 42

#48520 TABLEAU

#778248 TABLEAU

#201152 ENTIER 33

#200800 ENTIER 22

#200448 ENTIER 11

#201504 ENTIER 44 PILE

x y

(17)

A contrario

Modifier la variable x

I Ne modifie pas les objets existants.

I Ne change pas le contenu des objets désignés par d’autres variables.

Exemple

1 x = [11, 22, 33]

2 y = [x, 42]

3 x = [7, 8]

PILE x y

#48520 TABLEAU

#6984 TABLEAU

#200320 ENTIER 7

#200352 ENTIER 8

#48776 TABLEAU

#201440 ENTIER 42

#201152 ENTIER 33

#200800 ENTIER 22

#200448 ENTIER 11

(18)

À retenir

Distinction fondamentale

I Modifier une variable

I Modifier un objet

(19)

Comment créer / modifier une variable

Pour cela il n’y a que 2 instructionset demie:

Affectation devariable x = ecrée/modifie la variablex Passage de paramètre un appel à f([1, 2, 3])

def f(x):

...

crée une variable localex initialisée à[1, 2, 3]. +=,*=, . . . Elles modifientparfois une variable, parfois un objet.

(20)

Remarque

Un programme comportant une variablexmais pas d’instruction x = ... ou x += ..., . . . :

I ne peut changer la valeur de x

I change peut-être le contenu de l’objet désigné parx

(21)

Comment modifier un objet

I Instructions innombrables.

I Dépendent des objets.

I Quelques classiques :

Méthodes associées aux tableaux Exemples :

I x.append(17)

I x.pop(),

I x.insert(17, 28) Opérateurs I x[i] = e

I x[i:j] = e

I x[i][j] = e

I x[i, j] = e(matrices Numpy)

I etparfoisx += eetx *= e

Attention: ces opérateurs n’affectent pas lavariable xmaisl’objet désigné parx.

(22)

Les deux catégories d’objets en Python

Non-modifiables

I Les entiers.

I Les chaînes de caractères.

I Les n-uplets: (1, 2, 3, 'soleil'). Modifiables I Les tableaux.

I Les dictionnaires.

Une évidence

Sixdésigne un objetnon-modifiable, celui-ci ne peut pas être modifié.

(23)

Le cas de

+=

et

*=

L’instructionx = x + esignifie :

I créer un objet x + e

I puis modifier la variable xpour qu’elle désigne ce nouvel objet L’instructionx += e:

I signifie «modifier l’objet désigné parxpour l’augmenter dee».

I n’a de sens que si xdésigne un objet modifiable.

I dans le cas contraire, est un raccourci pourx = x + e.

(24)

Exercices

Que vauty après chacune de ces séquences d’instructions ?

1 x = 24

2 y = x

3 x += 3

1 x = [1, 2, 3]

2 y = x

3 x += [7, 8]

1 x = 'hello'

2 y = x

3 x += ' world'

(25)

Solution exercice 1

1 x = 24

2 y = x

3 x += 3

Avant la ligne 3

PILE x

y #200864

ENTIER 24

Après

PILE x y

#200960 ENTIER

27

#200864 ENTIER

24

Remarque

ydésignait un objet non-modifiable, qui ne pouvait donc être modifié.

(26)

Solution exercice 2

1 x = [1, 2, 3]

2 y = x

3 x += [7, 8]

Avant la ligne 3

PILE x

y #7048

TABLEAU

#200128 ENTIER 1

#200160 ENTIER 2

#200192 ENTIER 3

Après

PILE x

y #7048

TABLEAU

#200320 ENTIER 7

#200128 ENTIER 1

#200160 ENTIER 2

#200192 ENTIER 3

#200352 ENTIER 8

(27)

Solution exercice 3

1 x = 'hello'

2 y = x

3 x += ' world'

Avant la ligne 3

PILE x

y #444232

CHAÎNE hello

Après

PILE x y

#7408 CHAÎNE hello world

#444232 CHAÎNE hello

Remarque

ydésignait un objet non-modifiable

(28)

Cas des appels de fonctions

Lorsqu’on a une fonctiondef f(x): ... et qu’on appellef(e), Python:

I évalue l’expressione ;

I obtient ainsi une valeur (rappel : règle d’or) ;

I crée une nouvelle variablexsur la pile qu’il met à cette valeur ;

I exécute le corps de la fonction ;

I supprime la variable de la pile à la fin de la fonction.

(29)

Exemple

1 def f(t):

2 t = t + 2

3 return t

4

5 u = 11

6 v = f(u)

Avant ligne 2

PILE u

t #200448

ENTIER 11

Après ligne 2

PILE u

t

#200448 ENTIER

11

#200512 ENTIER

13

Après ligne 6

PILE u v

#200448 ENTIER

11

#200512 ENTIER

13

(30)

Exemple

1 def f(t):

2 t[0] += 2

3

4 u = [11, 22, 33]

5 f(u)

Avant ligne 2

PILE u

t #7624

TABLEAU

#200448 ENTIER 11

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 2

PILE u

t #7624

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 5

PILE

u #7624

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

(31)

Exemple

1 def f(t):

2 t[0] += 2

3 return t # là, on cherche les ennuis...

4

5 u = [11, 22, 33]

6 u = f(u)

Avant ligne 2

PILE u

t #7496

TABLEAU

#200448 ENTIER 11

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 2

PILE u

t #7496

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 6

PILE

u #7496

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

(32)

Exemple

1 def f(t):

2 t[0] += 2

3 return t # là, on cherche les ennuis...

4

5 u = [11, 22, 33]

6 v = f(u)

Avant ligne 2

PILE u

t #7496

TABLEAU

#200448 ENTIER 11

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 2

PILE u

t #7496

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 6

PILE u

v #7496

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

(33)

Remarque sur l’écriture des fonctions

Renvoyer un argument (éventuellement modifié) est :

Inutile L’utilisateur n’a pas besoin du résultat (il l’a déjà) Dangereux Cela laisse penser à l’utilisateur que :

I l’objet renvoyé est un nouvel objet

I la fonction ne modifie pas ses arguments Autant que possible, on choisira donc d’écrire :

I soit une fonction qui ne renvoie rien.

I soit une fonction qui ne modifie pas ses arguments.

(34)

Exercice

Que vaut u après ces instructions ?

1 u = [1, 3, 2]

2 t = u

3 t.sort()

Et après celles-ci ?

1 u = [1, 3, 2]

2 t = u

3 t = sorted(t)

(35)

Solution : cas de la méthode

sort

1 u = [1, 3, 2]

2 t = u

3 t.sort()

I L’exécution de la méthode sort

I peut modifier l’objet désigné part

I ne peut pas modifier la variablet

I Donc après la ligne 3, u ettdésignent encore le même objet.

I On peut penser que t.sort()trie le tableaut. Donct etu valent[1, 2, 3].

(36)

Solution : cas de la fonction

sorted

1 u = [1, 3, 2]

2 t = u

3 t = sorted(t)

I L’exécution de sorted(t) renvoie un résultat.

I Cela laisse penser qu’elle ne modifie pas t. Doncu vaut [1, 3, 2] (et t [1, 2, 3]).

(37)

Exercice

Que pensez-vous de la fonction suivante ?

1 def f(t):

2 m = t

3 m[0] += 2

4 return m

5

6 u = [11, 22, 33]

7 v = f(u)

(38)

Solution de l’exercice

1 def f(t):

2 m = t

3 m[0] += 2

4 return m

5

6 u = [11, 22, 33]

7 v = f(u)

Avant ligne 3

PILE u t m

#888136 TABLEAU

#200448 ENTIER 11

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 3

PILE u t m

#888136 TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

Après ligne 7

PILE u

v #888136

TABLEAU

#200512 ENTIER 13

#200800 ENTIER 22

#201152 ENTIER 33

(39)

Exercice

Récrire la fonctionf pour qu’elle ne modifie pas t:

1 def f(t):

2 m = t

3 m[0] += 2

4 return m

5

6 u = [11, 22, 33]

7 v = f(u)

(40)

Solution

1 def f(t):

2 m = t.copy()

3 m[0] += 2

4 return m

5

6 u = [11, 22, 33]

7 v = f(u)

Avant ligne 3

PILE u t m

#888136 TABLEAU

#7496 TABLEAU

#200800 ENTIER 22

#201152 ENTIER 33

#200448 ENTIER 11

Après ligne 3

#200800 ENTIER

#7496 22 TABLEAU

#200512 ENTIER 13

#201152 ENTIER 33 PILE

u t m

#888136 TABLEAU

#200448 ENTIER 11

Après ligne 7

PILE u v

#888136 TABLEAU

#7496 TABLEAU

#200800 ENTIER 22

#201152 ENTIER 33

#200448 ENTIER 11

#200512 ENTIER 13

(41)

Copie de tableaux

m = t.copy() équivaut àm = copie(t), avec la définition

1 def copie(t):

2 v = []

3 for x in t:

4 v.append(x)

5 return v

6 t = [11, 22, 33]

7 m = copie(t)

Avant ligne 3

#201152 ENTIER 33

#7048 TABLEAU

#7496 TABLEAU

#200448 ENTIER 11

#200800 ENTIER 22 PILE

t v

Avant ligne 5

PILE t v

#7496 TABLEAU

#7048 TABLEAU

#200800 ENTIER 22

#201152 ENTIER 33

#200448 ENTIER 11

Après ligne 7

#200800 ENTIER 22

#7048 TABLEAU

#200448 ENTIER 11

#201152 ENTIER 33 PILE

t m

#7496 TABLEAU

(42)

Remarques

I Différentes façons de copiert dansu:

I u = t.copy()

I u = copie(t)

I u = [x for x in t]

I u = t[:]

I u = list(t)

Façon canonique : la première

I Complexité (temps et mémoire) :

O(len(t))

(43)

Copier ou ne pas copier ?

Contexte : écriture d’une fonction qui modifie un tableaut La copie I Permet de garder les données originales de t

I Coûte cher en temps et mémoire (O(len(t))) Question Ai-jebesoinde garder la version précédente det?

Si oui Faire une copieudet, modifier uet le renvoyer.

Si non Modifier tet ne rien renvoyer.

(44)

Structures de données profondes

I Exemple : tableaux de tableaux.

I Les principes précédents restent valides.

I Réfléchir en ayant en tête :

La règle d’or Une valeur est juste l’adresse d’un objet.

La distinction fondamentale Modifier une variable/un objet.

(45)

Exercice : copie superficielle

Que valentu,v etw après ces instructions ?

1 u = [[1, 2, 3], [4, 5, 6]]

2 v = u.copy()

3 w = v

4 u[0] = [7, 8, 9]

5 u[1][0] = 17

(46)

Solution

Après les 3 premières lignes :

1 u = [[1, 2, 3], [4, 5, 6]]

2 v = u.copy()

3 w = v

PILE u v w

#6984 TABLEAU

#48456 TABLEAU

#7688 TABLEAU

#48520 TABLEAU

#200224 ENTIER 4

#200256 ENTIER 5

#200288 ENTIER 6

#200192 ENTIER 3

#200128 ENTIER 1

#200160 ENTIER 2

(47)

Solution (suite)

Et après les deux dernières :

4 u[0] = [7, 8, 9]

5 u[1][0] = 17

Remarque

I uetv ne sont pas les mêmes objets

I mais ils partagent leurs éléments

I en particulieru[1]et v[1] sont lemême tableau. . .

#200288 ENTIER 6

#200192 ENTIER 3

#200640 ENTIER 17

#48456 TABLEAU

#48520 TABLEAU

#7688 TABLEAU

#200128 ENTIER 1

#200160 ENTIER 2

#200256 ENTIER 5

#6856 TABLEAU

#200320 ENTIER 7

#200352 ENTIER 8

#200384 ENTIER 9 PILE

u v w

#6984 TABLEAU

(48)

Copie profonde

La fonctiondeepcopydu module copy brise le partage aussi profondément que nécessaire :

1 u = [[1, 2, 3], [4, 5, 6]]

2 v = deepcopy(u)

3 w = v

Remarque

I Coûte évidemment cher (temps et espace)

I À utiliser avec discernement

#200128 ENTIER 1

#200160 ENTIER 2

#7624 TABLEAU

#200224 ENTIER 4

#200256 ENTIER 5

#200288 ENTIER 6

#778248 TABLEAU

#6856 TABLEAU

#200192 ENTIER 3 PILE

u v w

#7112 TABLEAU

#6984 TABLEAU

#7176 TABLEAU

(49)

Quelques opérations classiques sur les tableaux Python

Répétition d’un tableau

u * n avecutableau équivaut à tableau(u, n)

1 def tableau(u, n):

2 t = []

3 for i in range(n):

4 t += u

5 return t

Exercice

Que vautM après les instructions

M = [[0] * 3] * 4 ; M[0][1] = 17?

(50)

Solution

1 M = [[0] * 3] * 4

2 M[0][1] = 17

Entre les deux lignes

PILE

M #888392

TABLEAU

#844488 TABLEAU

#200096 ENTIER 0

Après la ligne 2

PILE

M #888392

TABLEAU

#844488 TABLEAU

#200096 ENTIER 0

#200640 ENTIER 17

(51)

Slicing

Sur les tableaux Pythont[i:j]équivaut à slice(t, i, j)

1 def slice(t, i, j):

2 u = []

3 for k in range(i, j):

4 u.append(t[k])

5 return u

En particulier

I t[i:j]est un nouveau tableau, différent de t.

I ses éléments sont les mêmes que ceux de t d’indicesi(inclus) àj (exclu).

I t[:] (abréviation det[0:len(t)]) est unecopie det.

(52)

Exemple

I Après l’exécution de

t = [0, 11, 22, 33, 44, 55]

v = t[2:4]

v[1] = 17

I vvaut[22, 17]

I tvaut[0, 11, 22, 33, 44, 55]

I Cas des tableaux Numpy : après l’exécution de import numpy as np

t = np.array([0, 11, 22, 33, 44, 55]) v = t[2:4]

v[1] = 17

I vvautarray([22, 17])

I tvautarray([ 0, 11, 22, 17, 44, 55]).

(53)

Tableaux numpy

Avec un tableau numpyt,v = t[i:j]construit unevue surt.

I Cettevue ressemble à un tableau : opérations usuelles.

I v[k] renvoie la valeurt[h]hest calculé à partir de ket des paramètres de la vue (ici hvaut k+i).

I v[k] = va le même effet que t[h] = v: Pour une matricem(tableau bidimensionnel) :

I De même, m[i1:j1, i2:j2] est une vue sur la matricem.

(54)

Exercice

Écrire une fonctionechange(t, k)échangeant leskpremiers éléments detavec les kderniers, en supposant

1. t est un tableau Python.

2. t est un tableau Numpy.

(55)

Conclusion/résumé

La règle d’or Une valeur est juste l’adresse d’un objet.

La distinction fondamentale Modifier une variable/un objet.

Deux catégories d’objets Modifiables / non-modifiables.

(56)

Copyleft

Cette oeuvre est libre, vous pouvez la copier, la diffuser et la modifier selon les termes de la Licence Art Libre

http://artlibre.org, version 1.3 ou ultérieure.

Références

Documents relatifs

 Le titre et l'année des livres parus après 1999 sans doublons. SELECT DISTINCT l.titre, l.annéeParution FROM

Exemple introductif : passage de l’impératif à une approche objet Encapsulation : classe, objets, attributs, méthodes, etc.. Relations entre classes Relations d’utilisation

Sachant que le poids d’un objet correspond à la force gravitationnelle exercée par la Terre sur l’objet, écris l’égalité entre les relations des questions 1 et 3.. Déduis

En plus, la presence d'un motif sassanide sur un tissu de haute epoque islamique, ainsi que le lieu et I' evenement aux- quels cette piece peut etre rattachee

[Exemples de fonctions d’usage : Laisser une trace sur une feuille de papier – Transporter une personne – Transporter plusieurs personnes – Effacer une trace sur un papier –

 Pour vous aider, télécharger puis consulter le fichier 3 dimensions (3D) de la trottinette sur le site technoschool.free.fr à la page « 6 ème /Analyse et conception » dans

*Le référentiel... A) Trajectoire suivie par un objet. II) Reconnaître les différents types de mouvement.. C)Conclusions sur l’étude de mouvements rectilignes.. 1) Schéma1:

Ces liens sont décrits par des attributs particuliers, appelés attributs référence, qui ont pour domaine une classe d'objets;.. les liens de généralisation