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
--- a/mercurial/hgweb/hgweb_mod.py Mon Nov 02 23:37:14 2015 +0800
+++ b/mercurial/hgweb/hgweb_mod.py Mon Nov 02 23:37:49 2015 +0800
@@ -304,8 +304,8 @@
parts = parts[len(repo_parts):]
query = '/'.join(parts)
else:
- query = req.env['QUERY_STRING'].split('&', 1)[0]
- query = query.split(';', 1)[0]
+ query = req.env['QUERY_STRING'].partition('&')[0]
+ query = query.partition(';')[0]
# process this if it's a protocol request
# protocol bits don't need to create any URLs
--- a/mercurial/hgweb/request.py Mon Nov 02 23:37:14 2015 +0800
+++ b/mercurial/hgweb/request.py Mon Nov 02 23:37:49 2015 +0800
@@ -80,7 +80,7 @@
if self._start_response is not None:
self.headers.append(('Content-Type', type))
if filename:
- filename = (filename.split('/')[-1]
+ filename = (filename.rpartition('/')[-1]
.replace('\\', '\\\\').replace('"', '\\"'))
self.headers.append(('Content-Disposition',
'inline; filename="%s"' % filename))
--- a/mercurial/hgweb/webcommands.py Mon Nov 02 23:37:14 2015 +0800
+++ b/mercurial/hgweb/webcommands.py Mon Nov 02 23:37:49 2015 +0800
@@ -1248,7 +1248,7 @@
def _getdoc(e):
doc = e[0].__doc__
if doc:
- doc = _(doc).split('\n')[0]
+ doc = _(doc).partition('\n')[0]
else:
doc = _('(no help text available)')
return doc
@@ -1278,7 +1278,7 @@
yield {'topic': entries[0], 'summary': summary}
early, other = [], []
- primary = lambda s: s.split('|')[0]
+ primary = lambda s: s.partition('|')[0]
for c, e in commands.table.iteritems():
doc = _getdoc(e)
if 'DEPRECATED' in doc or c.startswith('debug'):