comparison mercurial/hgweb/request.py @ 26846:7c1b4840c2cd

hgweb: replace some str.split() calls by str.partition() or str.rpartition() Since Python 2.5 str has new methods: partition and rpartition. They are more specialized than the usual split and rsplit, and they sometimes convey the intent of code better and also are a bit faster (faster than split/rsplit with maxsplit specified). Let's use them in appropriate places for a small speedup. Example performance (partition): $ python -m timeit 'assert "apple|orange|banana".split("|")[0] == "apple"' 1000000 loops, best of 3: 0.376 usec per loop $ python -m timeit 'assert "apple|orange|banana".split("|", 1)[0] == "apple"' 1000000 loops, best of 3: 0.327 usec per loop $ python -m timeit 'assert "apple|orange|banana".partition("|")[0] == "apple"' 1000000 loops, best of 3: 0.214 usec per loop Example performance (rpartition): $ python -m timeit 'assert "apple|orange|banana".rsplit("|")[-1] == "banana"' 1000000 loops, best of 3: 0.372 usec per loop $ python -m timeit 'assert "apple|orange|banana".rsplit("|", 1)[-1] == "banana"' 1000000 loops, best of 3: 0.332 usec per loop $ python -m timeit 'assert "apple|orange|banana".rpartition("|")[-1] == "banana"' 1000000 loops, best of 3: 0.219 usec per loop
author Anton Shestakov <av6@dwimlabs.net>
date Mon, 02 Nov 2015 23:37:49 +0800
parents 461e7b700fdf
children 37fcfe52c68c
comparison
equal deleted inserted replaced
26845:7a77ee434179 26846:7c1b4840c2cd
78 78
79 def respond(self, status, type, filename=None, body=None): 79 def respond(self, status, type, filename=None, body=None):
80 if self._start_response is not None: 80 if self._start_response is not None:
81 self.headers.append(('Content-Type', type)) 81 self.headers.append(('Content-Type', type))
82 if filename: 82 if filename:
83 filename = (filename.split('/')[-1] 83 filename = (filename.rpartition('/')[-1]
84 .replace('\\', '\\\\').replace('"', '\\"')) 84 .replace('\\', '\\\\').replace('"', '\\"'))
85 self.headers.append(('Content-Disposition', 85 self.headers.append(('Content-Disposition',
86 'inline; filename="%s"' % filename)) 86 'inline; filename="%s"' % filename))
87 if body is not None: 87 if body is not None:
88 self.headers.append(('Content-Length', str(len(body)))) 88 self.headers.append(('Content-Length', str(len(body))))