Path 1: 1014 calls (0.99)

1def close(self) -> None:
2        """Compute and display similarities on closing (i.e. end of parsing)."""
3        total = sum(len(lineset) for lineset in self.linesets)
4        duplicated = 0
5        stats = self.linter.stats
6        for num, couples in self._compute_sims():
7            msg = []
8            lineset = start_line = end_line = None
9            for lineset, start_line, end_line in couples:
10                msg.append(f"=={lineset.name}:[{start_line}:{end_line}]")
11            msg.sort()
12
13            if lineset:
14                for line in lineset.real_lines[start_line:end_line]:
15                    msg.append(line.rstrip())
16
17            self.add_message("R0801", args=(len(couples), "\n".join(msg)))
18            duplicated += num * (len(couples) - 1)
19        stats.nb_duplicated_lines += int(duplicated)
20        stats.percent_duplicated_lines += float(total and duplicated * 100.0 / total)
            

Path 2: 8 calls (0.01)

1def close(self) -> None:
2        """Compute and display similarities on closing (i.e. end of parsing)."""
3        total = sum(len(lineset) for lineset in self.linesets)
4        duplicated = 0
5        stats = self.linter.stats
6        for num, couples in self._compute_sims():
7            msg = []
8            lineset = start_line = end_line = None
9            for lineset, start_line, end_line in couples:
10                msg.append(f"=={lineset.name}:[{start_line}:{end_line}]")
11            msg.sort()
12
13            if lineset:
14                for line in lineset.real_lines[start_line:end_line]:
15                    msg.append(line.rstrip())
16
17            self.add_message("R0801", args=(len(couples), "\n".join(msg)))
18            duplicated += num * (len(couples) - 1)
19        stats.nb_duplicated_lines += int(duplicated)
20        stats.percent_duplicated_lines += float(total and duplicated * 100.0 / total)