这是 RevisionSet 的快速替换,可以将其变成一个集合。它应该快得多。我没有完全测试它,但它适用于我所做的所有测试。毫无疑问,还有其他方法可以加快速度,但我认为这确实会有所帮助,因为它实际上利用了集合的快速实现,而不是在 Python 中执行原始代码在函数中执行的循环,如__sub__
和__and__
。唯一的问题是迭代器没有排序。您可能需要更改一些代码来解决此问题。我相信还有其他方法可以改进这一点,但希望它会给你一个好的开始。
class RevisionSet(set):
"""
A set of revisions, held in dictionary form for easy manipulation. If we
were to rewrite this script for Python 2.3+, we would subclass this from
set (or UserSet). As this class does not include branch
information, it's assumed that one instance will be used per
branch.
"""
def __init__(self, parm):
"""Constructs a RevisionSet from a string in property form, or from
a dictionary whose keys are the revisions. Raises ValueError if the
input string is invalid."""
revision_range_split_re = re.compile('[-:]')
if isinstance(parm, set):
print "1"
self.update(parm.copy())
elif isinstance(parm, list):
self.update(set(parm))
else:
parm = parm.strip()
if parm:
for R in parm.split(","):
rev_or_revs = re.split(revision_range_split_re, R)
if len(rev_or_revs) == 1:
self.add(int(rev_or_revs[0]))
elif len(rev_or_revs) == 2:
self.update(set(range(int(rev_or_revs[0]),
int(rev_or_revs[1])+1)))
else:
raise ValueError, 'Ill formatted revision range: ' + R
def sorted(self):
return sorted(self)
def normalized(self):
"""Returns a normalized version of the revision set, which is an
ordered list of couples (start,end), with the minimum number of
intervals."""
revnums = sorted(self)
revnums.reverse()
ret = []
while revnums:
s = e = revnums.pop()
while revnums and revnums[-1] in (e, e+1):
e = revnums.pop()
ret.append((s, e))
return ret
def __str__(self):
"""Convert the revision set to a string, using its normalized form."""
L = []
for s,e in self.normalized():
if s == e:
L.append(str(s))
else:
L.append(str(s) + "-" + str(e))
return ",".join(L)
补充:
顺便说一下,我比较了原始 RevisionSet 和上面我的 RevisionSet 的并集、交集和减法,当对两个具有 75000 个元素的 RevisionSet 进行操作时,上面的代码对于这些操作的速度要快 3 倍到 7 倍。我知道其他人说 numpy 是要走的路,但是如果您对 Python 不是很有经验,正如您的评论所示,那么您可能不想走那条路,因为它将涉及更多的更改。我建议尝试我的代码,看看它是否有效,如果有效,然后看看它对你来说是否足够快。如果不是,那么我会尝试分析以查看需要改进的地方。只有这样我才会考虑使用 numpy(这是一个我经常使用的很棒的包)。