last tp
This commit is contained in:
		
							
								
								
									
										72
									
								
								17nov/displayCpu.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								17nov/displayCpu.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,72 @@
 | 
			
		||||
"""Pour executer ce script, vous devez installer matplotlib"""
 | 
			
		||||
 | 
			
		||||
import matplotlib.pyplot as plt
 | 
			
		||||
import itertools
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CpuPlot(object):
 | 
			
		||||
    def __init__(self, n):
 | 
			
		||||
        """
 | 
			
		||||
        Initialize an object that will be used to display data points on the
 | 
			
		||||
        screen.
 | 
			
		||||
        n   --  An array of x-values.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        self.n = n
 | 
			
		||||
        self.courbes = []
 | 
			
		||||
        self.labels = []
 | 
			
		||||
 | 
			
		||||
    def prepare(self, data, label=None):
 | 
			
		||||
        """
 | 
			
		||||
        Add a data points.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        self.courbes.append(data)
 | 
			
		||||
        self.labels.append(label)
 | 
			
		||||
 | 
			
		||||
    def reset(self):
 | 
			
		||||
        """
 | 
			
		||||
        Reset data points. Note that x-values are keeped.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        self.courbes = []
 | 
			
		||||
 | 
			
		||||
    def draw(self):
 | 
			
		||||
        """
 | 
			
		||||
        Draw the data points on the screen.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        plt.xlim(max(0, min(self.n) - 5), max(self.n) + 5)
 | 
			
		||||
        plt.ylim(0, max([max(t) for t in self.courbes]) + 5)
 | 
			
		||||
 | 
			
		||||
        plt.xlabel('input size')
 | 
			
		||||
        plt.ylabel('milliseconds')
 | 
			
		||||
        plt.title('CPU time charts')
 | 
			
		||||
 | 
			
		||||
        color = itertools.cycle('bgrcmyk')
 | 
			
		||||
 | 
			
		||||
        for i, t in enumerate(self.courbes):
 | 
			
		||||
            if self.labels[i] is None:
 | 
			
		||||
                plt.plot(self.n, t, '%s-o' % next(color),
 | 
			
		||||
                        label='Data points %d' % i)
 | 
			
		||||
            else:
 | 
			
		||||
                plt.plot(self.n, t, '%s-o' % next(color),
 | 
			
		||||
                        label=self.labels[i])
 | 
			
		||||
 | 
			
		||||
        plt.legend()
 | 
			
		||||
        plt.show()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    # Create a CpuPlot object for x-values 10, 20, 30, 40
 | 
			
		||||
    afficheur = CpuPlot([10, 20, 30, 40])
 | 
			
		||||
 | 
			
		||||
    # Add two sets of data points
 | 
			
		||||
    afficheur.prepare([1.1, 2.4, 2.8, 4.1], "Points 1")
 | 
			
		||||
    afficheur.prepare([1.2, 4.5, 8.4, 16.5])
 | 
			
		||||
 | 
			
		||||
    # Display
 | 
			
		||||
    afficheur.draw()
 | 
			
		||||
 | 
			
		||||
    # Don't exit too fast
 | 
			
		||||
    input("Press [Enter] to exit.")
 | 
			
		||||
							
								
								
									
										25
									
								
								17nov/ex5.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								17nov/ex5.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
 | 
			
		||||
def bubble_sort(liste:list):
 | 
			
		||||
    """Sort the list with bubble sort inline """
 | 
			
		||||
    Order = False
 | 
			
		||||
    while not Order:
 | 
			
		||||
        Order = True
 | 
			
		||||
        for i in range(len(liste)-1):
 | 
			
		||||
            if liste[i] > liste[i+1]:
 | 
			
		||||
                liste[i], liste[i+1] = liste[i+1], liste[i]
 | 
			
		||||
                Order = False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    from random import shuffle
 | 
			
		||||
 | 
			
		||||
    from displayCpu import CpuPlot
 | 
			
		||||
    from umons_cpu import cpu_time
 | 
			
		||||
    from sort import dicho_search, insertion_sort,  merge_sort, selection_sort
 | 
			
		||||
 | 
			
		||||
    test_bubble = [cpu_time(bubble_sort, [i for i in range(j)]) for j in range(10)]
 | 
			
		||||
    
 | 
			
		||||
    graph = CpuPlot(list(range(10)))
 | 
			
		||||
    graph.prepare(test_bubble)
 | 
			
		||||
    graph.draw()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								17nov/serie8.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								17nov/serie8.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										107
									
								
								17nov/sort.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								17nov/sort.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,107 @@
 | 
			
		||||
"""
 | 
			
		||||
Voir commentaires concernant ce module dans l'enonce de la serie de TP.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import random
 | 
			
		||||
import umons_cpu
 | 
			
		||||
 | 
			
		||||
def python_sort(t):
 | 
			
		||||
    t.sort()
 | 
			
		||||
 | 
			
		||||
def insertion_sort(t):
 | 
			
		||||
    n = len(t)
 | 
			
		||||
    for i in range(1,n):
 | 
			
		||||
        clef = t[i]
 | 
			
		||||
        j = i - 1
 | 
			
		||||
        while j >= 0 and t[j] > clef:
 | 
			
		||||
            t[j+1] = t[j]
 | 
			
		||||
            j = j - 1
 | 
			
		||||
        t[j+1] = clef
 | 
			
		||||
 | 
			
		||||
def selection_sort(t):
 | 
			
		||||
    n = len(t)
 | 
			
		||||
    for i in range(n-1):
 | 
			
		||||
        small = i
 | 
			
		||||
        for j in range(i+1,n):
 | 
			
		||||
            if t[j] < t[small]:
 | 
			
		||||
                small = j
 | 
			
		||||
        (t[i], t[small]) = (t[small], t[i])
 | 
			
		||||
 | 
			
		||||
# permet d'avoir une interface in place, similaire aux autres tris
 | 
			
		||||
def merge_sort(t):
 | 
			
		||||
    t[:] = merge_sort_functionnal(t)
 | 
			
		||||
 | 
			
		||||
def merge_sort_functionnal(t):
 | 
			
		||||
    n = len(t)
 | 
			
		||||
    if n > 1:
 | 
			
		||||
        (t1, t2) = split(t)
 | 
			
		||||
        t1 = merge_sort_functionnal(t1)
 | 
			
		||||
        t2 = merge_sort_functionnal(t2)
 | 
			
		||||
        return merge(t1, t2)
 | 
			
		||||
    else:
 | 
			
		||||
        return t
 | 
			
		||||
 | 
			
		||||
def split(t):
 | 
			
		||||
    """ precondition: len(t) >= 2 """
 | 
			
		||||
    mid = len(t) // 2
 | 
			
		||||
    t1 = t[:mid]
 | 
			
		||||
    t2 = t[mid:]
 | 
			
		||||
    return (t1, t2)
 | 
			
		||||
 | 
			
		||||
def merge(t1, t2):
 | 
			
		||||
    if len(t1) == 0:
 | 
			
		||||
        return t2
 | 
			
		||||
    elif len(t2) == 0:
 | 
			
		||||
        return t1
 | 
			
		||||
    elif t1[0] < t2[0]:
 | 
			
		||||
        return [t1[0]] + merge(t1[1:], t2)
 | 
			
		||||
    else:
 | 
			
		||||
        return [t2[0]] + merge(t1, t2[1:])
 | 
			
		||||
 | 
			
		||||
def dicho_search(t, x):
 | 
			
		||||
    start = 0
 | 
			
		||||
    end = len(t) - 1
 | 
			
		||||
    mid = start + (end - start) // 2
 | 
			
		||||
    while (end - start > 0) and x != t[mid]:
 | 
			
		||||
        if x < t[mid]:
 | 
			
		||||
            end = mid - 1
 | 
			
		||||
        else:
 | 
			
		||||
            start = mid + 1
 | 
			
		||||
        mid = start + (end - start) // 2
 | 
			
		||||
    if len(t) > 0 and x == t[mid]:
 | 
			
		||||
        return mid
 | 
			
		||||
    else:
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
def test(n):
 | 
			
		||||
    t1 = list(range(n))
 | 
			
		||||
    t2 = list(range(n,0,-1))
 | 
			
		||||
    t3 = []
 | 
			
		||||
    for i in range(n):
 | 
			
		||||
        t3.append(random.randint(0,n))
 | 
			
		||||
    print('%7d %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f' % (
 | 
			
		||||
        n,
 | 
			
		||||
        umons_cpu.cpu_time(selection_sort, t1),
 | 
			
		||||
        umons_cpu.cpu_time(insertion_sort, t1),
 | 
			
		||||
        umons_cpu.cpu_time(merge_sort, t1),
 | 
			
		||||
        umons_cpu.cpu_time(selection_sort, t2),
 | 
			
		||||
        umons_cpu.cpu_time(insertion_sort, t2),
 | 
			
		||||
        umons_cpu.cpu_time(merge_sort, t2),
 | 
			
		||||
        umons_cpu.cpu_time(selection_sort, t3),
 | 
			
		||||
        umons_cpu.cpu_time(insertion_sort, t3),
 | 
			
		||||
        umons_cpu.cpu_time(merge_sort, t3)))
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    print('Temps affiches en msec')
 | 
			
		||||
    print('      n '
 | 
			
		||||
          't1: sel '
 | 
			
		||||
          '    ins '
 | 
			
		||||
          '    mer '
 | 
			
		||||
          't2: sel '
 | 
			
		||||
          '    ins '
 | 
			
		||||
          '    mer '
 | 
			
		||||
          't3: sel '
 | 
			
		||||
          '    ins '
 | 
			
		||||
          '    mer')
 | 
			
		||||
    for i in range(100, 901, 100):
 | 
			
		||||
        test(i)
 | 
			
		||||
							
								
								
									
										109
									
								
								17nov/umons_cpu.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								17nov/umons_cpu.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,109 @@
 | 
			
		||||
"""
 | 
			
		||||
Module utilisé à l'UMONS dans le cadre des cours de Programmation et
 | 
			
		||||
Algorithmique 1 et Structure de Données 1 pour faciliter le calcul
 | 
			
		||||
des temps CPU.
 | 
			
		||||
 | 
			
		||||
Auteur: Pierre Hauweele et Hadrien Mélot (Université de Mons), 2016
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import timeit
 | 
			
		||||
import pickle
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def __init_timer__(f, *args):
 | 
			
		||||
    fs = pickle.dumps(f)
 | 
			
		||||
    argss = pickle.dumps(args)
 | 
			
		||||
    setup = \
 | 
			
		||||
"""
 | 
			
		||||
import pickle
 | 
			
		||||
import copy
 | 
			
		||||
f = pickle.loads(%s)
 | 
			
		||||
args = pickle.loads(%s)
 | 
			
		||||
""" % (fs, argss)
 | 
			
		||||
    stmt = 'f(*copy.deepcopy(args))'
 | 
			
		||||
    return timeit.Timer(stmt, setup)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def __calibrate__(t):
 | 
			
		||||
    calibrate_test = 0
 | 
			
		||||
    n = 1
 | 
			
		||||
 | 
			
		||||
    while calibrate_test < 0.1:
 | 
			
		||||
        n *= 10
 | 
			
		||||
        calibrate_test = t.timeit(n)
 | 
			
		||||
 | 
			
		||||
    return n, calibrate_test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def cpu_time(f, *args):
 | 
			
		||||
    """ Retourne un temps CPU exprimé en millisecondes (ms)
 | 
			
		||||
            - f : fonction ou méthode à tester
 | 
			
		||||
            - *args : liste d'arguments pour f. Ces arguments ne sont pas
 | 
			
		||||
              modifiés, même si la fonction f a des effets de bord (ils sont
 | 
			
		||||
              copiés avant l'exécution).
 | 
			
		||||
 | 
			
		||||
            Exemples :
 | 
			
		||||
                cputime(math.sqrt, 4)
 | 
			
		||||
                   pour calculer le temps CPU de math.sqrt(4)
 | 
			
		||||
                cputime(str.upper, 'hello')
 | 
			
		||||
                   pour calculer le temps CPU de 'hello'.upper()
 | 
			
		||||
                cputime(myfunc, x, y, z)
 | 
			
		||||
                   pour calculer le temps CPU de myfunc(x, y, z)
 | 
			
		||||
    """
 | 
			
		||||
    t = __init_timer__(f, *args)
 | 
			
		||||
 | 
			
		||||
    n, cal_time = __calibrate__(t)
 | 
			
		||||
 | 
			
		||||
    res = min([cal_time] + t.repeat(2, n))
 | 
			
		||||
 | 
			
		||||
    return (res / n) * 1000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def calibrate(f, *args):
 | 
			
		||||
    """ Retourne un nombre de tests qui rend le calcul du temps CPU
 | 
			
		||||
        a priori raisonnable.
 | 
			
		||||
            - f : fonction ou méthode à tester
 | 
			
		||||
            - *args : liste d'arguments pour f. Ces arguments ne sont pas
 | 
			
		||||
              modifiés, même si la fonction f a des effets de bord (ils sont
 | 
			
		||||
              copiés avant l'exécution).
 | 
			
		||||
 | 
			
		||||
        Le nombre de tests retourné est une puissance de 10 (au minimum 10). Il
 | 
			
		||||
        sera d'autant plus grand si la fonction semble rapide.
 | 
			
		||||
    """
 | 
			
		||||
    t = __init_timer__(f, *args)
 | 
			
		||||
 | 
			
		||||
    n, cal_time = __calibrate__(t)
 | 
			
		||||
 | 
			
		||||
    return n
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def cpu_time_without_copy(f, *args):
 | 
			
		||||
    """ Retourne un temps CPU exprimé en millisecondes (ms)
 | 
			
		||||
            - f : fonction ou méthode à tester
 | 
			
		||||
            - *args : liste d'arguments pour f.
 | 
			
		||||
            Cette version ne copie pas les arguments:
 | 
			
		||||
            il ne faut donc l'utiliser qu'avec des fonctions
 | 
			
		||||
            sans effet de bord !
 | 
			
		||||
    """
 | 
			
		||||
    fs = pickle.dumps(f)
 | 
			
		||||
    argss = pickle.dumps(args)
 | 
			
		||||
    setup = \
 | 
			
		||||
"""
 | 
			
		||||
import pickle
 | 
			
		||||
f = pickle.loads(%s)
 | 
			
		||||
args = pickle.loads(%s)
 | 
			
		||||
""" % (fs, argss)
 | 
			
		||||
    stmt = 'f(*args)'
 | 
			
		||||
    t = timeit.Timer(stmt, setup)
 | 
			
		||||
 | 
			
		||||
    calibrate_test = 0
 | 
			
		||||
    n = 1
 | 
			
		||||
 | 
			
		||||
    while calibrate_test < 0.1:
 | 
			
		||||
        n *= 10
 | 
			
		||||
        calibrate_test = t.timeit(n)
 | 
			
		||||
 | 
			
		||||
    res = min([calibrate_test] + t.repeat(2, n))
 | 
			
		||||
 | 
			
		||||
    return (res / n) * 1000
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								renforcement/dhcp-4.4.3.P1-1-x86_64.pkg.tar.zst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								renforcement/dhcp-4.4.3.P1-1-x86_64.pkg.tar.zst
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user