def get_gaps_and_overlaps2(self, tier1, tier2, maxlen=-1):
        """Faster variant of :func:`get_gaps_and_overlaps`. Faster in this case
        means almost 100 times faster...

        :param str tier1: Name of the first tier.
        :param str tier2: Name of the second tier.
        :param int maxlen: Maximum length of gaps (skip longer ones), if ``-1``
                           no maximum will be used.
        :yields: Tuples of the form ``[(start, end, type)]``.
        :raises KeyError: If a tier is non existent.
        """
        ad = sorted(((a, i+1) for i, t in enumerate([tier1, tier2]) for a in
                     self.get_annotation_data_for_tier(t)), reverse=True)
        if ad:
            last = (lambda x: (x[0][0], x[0][1], x[1]))(ad.pop())

            def thr(x, y):
                return maxlen == -1 or abs(x-y) < maxlen
            while ad:
                (begin, end, _), current = ad.pop()
                if last[2] == current and thr(begin, last[1]):
                    yield (last[1], begin, 'P{}'.format(current))
                elif last[0] < begin and last[1] > end:
                    yield (begin, end, 'W{}{}'.format(last[2], current))
                    continue
                elif last[1] > begin:
                    yield (begin, last[1], 'O{}{}'.format(last[2], current))
                elif last[1] < begin and thr(begin, last[1]):
                    yield (last[1], begin, 'G{}{}'.format(last[2], current))
                last = (begin, end, current)
def get_gaps_and_overlaps2(self, tier1, tier2, maxlen=-1):
        """Faster variant of :func:`get_gaps_and_overlaps`. Faster in this case
        means almost 100 times faster...

        :param str tier1: Name of the first tier.
        :param str tier2: Name of the second tier.
        :param int maxlen: Maximum length of gaps (skip longer ones), if ``-1``
                           no maximum will be used.
        :yields: Tuples of the form ``[(start, end, type)]``.
        :raises KeyError: If a tier is non existent.
        """
        ad = sorted(((a, i+1) for i, t in enumerate([tier1, tier2]) for a in
                     self.get_annotation_data_for_tier(t)), reverse=True)
        if ad:
            last = (lambda x: (x[0][0], x[0][1], x[1]))(ad.pop())

            def thr(x, y):
                return maxlen == -1 or abs(x-y) < maxlen
            while ad:
                (begin, end, _), current = ad.pop()
                if last[2] == current and thr(begin, last[1]):
                    yield (last[1], begin, 'P{}'.format(current))
                elif last[0] < begin and last[1] > end:
                    yield (begin, end, 'W{}{}'.format(last[2], current))
                    continue
                elif last[1] > begin:
                    yield (begin, last[1], 'O{}{}'.format(last[2], current))
                elif last[1] < begin and thr(begin, last[1]):
                    yield (last[1], begin, 'G{}{}'.format(last[2], current))
                last = (begin, end, current)
def get_gaps_and_overlaps2 ( self , tier1 , tier2 , maxlen = - 1 ) : ad = sorted ( ( ( a , i + 1 ) for i , t in enumerate ( [ tier1 , tier2 ] ) for a in self . get_annotation_data_for_tier ( t ) ) , reverse = True ) if ad : last = ( lambda x : ( x [ 0 ] [ 0 ] , x [ 0 ] [ 1 ] , x [ 1 ] ) ) ( ad . pop ( ) ) def thr ( x , y ) : return maxlen == - 1 or abs ( x - y ) < maxlen while ad : ( begin , end , _ ) , current = ad . pop ( ) if last [ 2 ] == current and thr ( begin , last [ 1 ] ) : yield ( last [ 1 ] , begin , 'P{}' . format ( current ) ) elif last [ 0 ] < begin and last [ 1 ] > end : yield ( begin , end , 'W{}{}' . format ( last [ 2 ] , current ) ) continue elif last [ 1 ] > begin : yield ( begin , last [ 1 ] , 'O{}{}' . format ( last [ 2 ] , current ) ) elif last [ 1 ] < begin and thr ( begin , last [ 1 ] ) : yield ( last [ 1 ] , begin , 'G{}{}' . format ( last [ 2 ] , current ) ) last = ( begin , end , current )
Faster variant of :func:`get_gaps_and_overlaps`. Faster in this case
        means almost 100 times faster...

        :param str tier1: Name of the first tier.
        :param str tier2: Name of the second tier.
        :param int maxlen: Maximum length of gaps (skip longer ones), if ``-1``
                           no maximum will be used.
        :yields: Tuples of the form ``[(start, end, type)]``.
        :raises KeyError: If a tier is non existent.
Faster variant of : func : get_gaps_and_overlaps . Faster in this case means almost 100 times faster ...