From 1312039a55f2202c3a608bd375e7379f9c3d0f38 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Mon, 24 Feb 2014 21:42:22 +0100 Subject: [PATCH] =?UTF-8?q?[lc=5Fldap.=5Ffind=5Fid]=20Dans=20le=20cas=20no?= =?UTF-8?q?n=20strictement=20croissant=20des=20id,=20on=20utilise=20un=20s?= =?UTF-8?q?et=20pour=20stocker=20les=20id=20d=C3=A9j=C3=A0=20pris?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En effet, en effectue ensuite un nombre important de fois l'opération i in nonfree. Avec des liste l'opération est en O(n) alors qu'elle est en O(1) avec des set --- lc_ldap.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lc_ldap.py b/lc_ldap.py index 6309e1b..e2f74df 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -420,24 +420,10 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): # On récupère tous les id res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr]) - # On extrait seulement les valeurs des id qui nous intêressent - nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] - # On trie pour récupérer le dernier - nonfree.sort() - - try: - last_id = nonfree[-1] - except IndexError: - last_id = 0 - - if plage is None: - # On écrit le nouveau dernier id connu - f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600) - os.write(f, str(last_id)) - os.close(f) - - if plage != None: + # On extrait seulement les valeurs des id qui nous intêressent, dans un set + # car on n'a pas besoin de trier et que et que i in set c'est O(1) contre O(n) pour les list + nonfree = set(int(r[1].get(attr)[0]) for r in res if r[1].get(attr)) for i in plage: if i in nonfree: continue @@ -456,6 +442,20 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' % (attr, plage[0], i)) else: + # On extrait seulement les valeurs des id qui nous intêressent dans une liste + nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] + # On trie pour récupérer le dernier + nonfree.sort() + try: + last_id = nonfree[-1] + except IndexError: + last_id = 0 + + # On écrit le nouveau dernier id connu + f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600) + os.write(f, str(last_id)) + os.close(f) + i = last_id + 1 while True: try: