From: Eric S. Raymond Date: Thu, 13 Nov 2014 19:18:43 +0000 (-0500) Subject: Avoid O(n**2) lookups via hashes. Regression test passes. X-Git-Tag: 0.8~16 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=0b03163dbcd08e6327f8c143cf6d10916d47f49b;p=src.git Avoid O(n**2) lookups via hashes. Regression test passes. --- diff --git a/src b/src index f78e342..a4af34c 100755 --- a/src +++ b/src @@ -178,6 +178,11 @@ class History: if not os.path.exists(backend.master(self.name)): croak("%s is not registered" % self.name) backend.parse(self) + self.by_revno_d = {} + self.by_native_d = {} + for item in self.revlist: + self.by_revno_d[item.revno] = item + self.by_native_d[item.revision] = item def __len__(self): return len(self.revlist) def current(self): @@ -224,22 +229,17 @@ class History: s = nxt def native_to_revno(self, revision): "Map a native ID to a revno" - for item in self.revlist: - if item.revision == revision: - return item.revno - return None + item = self.by_native_d.get(revision) + return item and item.revno def by_revno(self, revno): "Map a revno to a revision item." - for item in self.revlist: - if item.revno == revno: - return item - croak("{0} has no revno {1}".format(self.name, revno)) + try: + return self.by_revno_d[revno] + except KeyError: + croak("{0} has no revno {1}".format(self.name, revno)) def revno_to_native(self, revno): "Map a revno to a native ID" - for item in self.revlist: - if item.revno == revno: - return item.revision - croak("{0} has no revno {1}".format(self.name, revno)) + return self.by_revno(revno).revision def help_method(*_args): "Summarize src commands, or (with argument) show help for a single command."