これは、セットにする RevisionSet の簡単な置き換えです。それははるかに速いはずです。完全にテストしたわけではありませんが、行ったすべてのテストで機能しました。__sub__スピードアップする方法は間違いなく他にもありますが、元のコードがやのような関数で行っていた Python のループを実行するのではなく、セットの高速な実装を実際に利用するので、これは本当に役立つと思います__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 要素を持つ 2 つの RevisionSet を操作する場合、上記のコードはこれらの操作で 3 倍から 7 倍高速です。他の人がnumpyが進むべき道だと言っていることは知っていますが、コメントが示すように、Pythonの経験があまりない場合は、より多くの変更が必要になるため、そのルートに行きたくないかもしれません. 私のコードを試して、それが機能するかどうかを確認し、機能する場合は、十分に高速かどうかを確認することをお勧めします. そうでない場合は、プロファイリングを行って、改善が必要なものを確認します。そうして初めて、numpy の使用を検討します (これは、私が頻繁に使用する優れたパッケージです)。