⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timelog.py

📁 PHP写的图片查看器
💻 PY
字号:
import timeimport stringimport profileimport rcsparseimport viewcvsdef lines_changed(delta):  idx = 0  added = deleted = 0  while idx < len(delta):    op = delta[idx]    i = string.find(delta, ' ', idx + 1)    j = string.find(delta, '\n', i + 1)    line = int(delta[idx+1:i])    count = int(delta[i+1:j])    idx = j + 1    if op == 'd':      deleted = deleted + count    else: # 'a' for adding text      added = added + count      # skip new text      while count > 0:        nl = string.find(delta, '\n', idx)        assert nl > 0, 'missing a newline in the delta in the RCS file'        idx = nl + 1        count = count - 1  return added, deletedclass FetchSink(rcsparse.Sink):  def __init__(self, which_rev=None):    self.head = self.branch = ''    self.tags = { }    self.meta = { }    self.revs = [ ]    self.base = { }    self.entries = { }    self.which = which_rev  def set_head_revision(self, revision):    self.head = revision  def set_principal_branch(self, branch_name):    self.branch = branch_name  def define_tag(self, name, revision):    self.tags[name] = revision  def define_revision(self, revision, timestamp, author, state,                      branches, next):    self.meta[revision] = (timestamp, author, state)    self.base[next] = revision    for b in branches:      self.base[b] = revision  def set_revision_info(self, revision, log, text):    timestamp, author, state = self.meta[revision]    entry = viewcvs.LogEntry(revision, int(timestamp) - time.timezone, author,                             state, None, log)    # .revs is "order seen" and .entries is for random access    self.revs.append(entry)    self.entries[revision] = entry    if revision != self.head:      added, deleted = lines_changed(text)      if string.count(revision, '.') == 1:        # on the trunk. reverse delta.        changed = '+%d -%d' % (deleted, added)        self.entries[self.base[revision]].changed = changed      else:        # on a branch. forward delta.        changed = '+%d -%d' % (added, deleted)        self.entries[revision].changed = changed  def parse_completed(self):    if self.which:      self.revs = [ self.entries[self.which] ]def fetch_log2(full_name, which_rev=None):  sink = FetchSink(which_rev)  rcsparse.Parser().parse(open(full_name), sink)  return sink.head, sink.branch, sink.tags, sink.revsdef compare_fetch(full_name, which_rev=None):  d1 = viewcvs.fetch_log(full_name, which_rev)  d2 = fetch_log2(full_name, which_rev)  if d1[:3] != d2[:3]:    print 'd1:', d1[:3]    print 'd2:', d2[:3]    return  if len(d1[3]) != len(d2[3]):    print 'len(d1[3])=%d  len(d2[3])=%d' % (len(d1[3]), len(d2[3]))    return  def sort_func(e, f):    return cmp(e.rev, f.rev)  d1[3].sort(sort_func)  d2[3].sort(sort_func)  import pprint  for i in range(len(d1[3])):    if vars(d1[3][i]) != vars(d2[3][i]):      pprint.pprint((i, vars(d1[3][i]), vars(d2[3][i])))def time_fetch(full_name, which_rev=None):  t = time.time()  viewcvs.fetch_log(full_name, which_rev)  t1 = time.time() - t  t = time.time()  fetch_log2(full_name, which_rev)  t2 = time.time() - t  print t1, t2def profile_fetch(full_name, which_rev=None):  p = profile.Profile()  def many_calls(*args):    for i in xrange(10):      apply(fetch_log2, args)  p.runcall(many_calls, full_name, which_rev)  p.print_stats()def varysize(full_name, which_rev=None):  def one_run(n, *args):    rcsparse._TokenStream.CHUNK_SIZE = n    t = time.time()    for i in xrange(5):      apply(fetch_log2, args)    print n, time.time() - t  #one_run(2020, full_name, which_rev)  #one_run(4070, full_name, which_rev)  #one_run(8170, full_name, which_rev)  #one_run(8192, full_name, which_rev)  #one_run(16384, full_name, which_rev)  one_run(32740, full_name, which_rev)  one_run(65500, full_name, which_rev)  one_run(100000, full_name, which_rev)  one_run(200000, full_name, which_rev)  one_run(500000, full_name, which_rev)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -