# coding=utf-8 # Build and return a list # equivalent de la fonction intégrée xrange() # toujours préférer les fonctions intégrées. # -> elles ont été optimisées. # iterateurs/generateurs # http://anandology.com/python-practice-book/iterators.html import time import resource import gc import sys #fonction qui renvoit la liste des entier de 0 à n-1 def firstn_not_gen(n): num, nums = 0, [] while num < n: nums.append(num) num += 1 return nums #construction d'un iterateur equivalent class firstn_iter(object): def __init__(self,high): self.current=0 self.high=high def __iter__(self): return self def next(self): if self.current < self.high: self.current+=1 return self.current-1 else: raise StopIteration #meme chose mais avec generateur def firstn_gen(n): num, nums = 0, [] while num < n: yield num num += 1 def range_maison_no_iter(num): sum_of_first_n = sum(firstn_not_gen(num)) def range_maison_iter(num): sum_of_first_n = sum(firstn_iter(num)) def range_maison_gen(num): sum_of_first_n = sum(firstn_gen(num)) def range_builtin(num): sum_of_first_n = sum(range(num)) def xrange_builtin(num): sum_of_first_n = sum(xrange(num)) def xrange_builtin(num): sum_of_first_n = sum(xrange(num)) def profile(f,num): print "Benchmarking "+f.__name__ start=time.time() start_mem=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss f(num) stop=time.time() end_mem=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss print "Durée: "+str(stop-start) + "s Consommation mémoire: "+str((end_mem-start_mem)/1024) + "Kib" if __name__=='__main__': funcs = { 'range_maison_no_iter': range_maison_no_iter, 'range_maison_iter' : range_maison_iter, 'range_maison_gen' : range_maison_gen, 'range_builtin' : range_builtin, 'xrange_builtin' : xrange_builtin, } #num=10000000 method_name=sys.argv[1] if method_name in funcs: profile(funcs[method_name],(int(sys.argv[2]))) else: raise Exception("Method %s not implemented" % method_name)