New submission from Guido van Rossum:
I'm trying to speed up a web template engine and I find that the code needs to
do a lot of string replacements of this form:
name = name.replace('_', '-')
Characteristics of the data: the names are relatively short (1-10 characters
usually), and the majority don't contain a '_' at all.
For this combination I've found that the following idiom is significantly
faster:
if '_' in name:
name = name.replace('_', '-')
I'd hate for that idiom to become popular. I looked at the code (in the
default branch) briefly, but it is already optimized for this case. So I am at
a bit of a loss to explain the speed difference...
Some timeit experiments:
bash-3.2$ ./python.exe -m timeit -s a = 'hundred' 'x' in a
./python.exe -m timeit -s a = 'hundred' 'x' in a
bash-3.2$ ./python.exe -m timeit -s a = 'hundred' a.replace('x', 'y')
./python.exe -m timeit -s a = 'hundred' a.replace('x', 'y')
bash-3.2$ ./python.exe -m timeit -s a = 'hundred' if 'x' in a:
a.replace('x', 'y')
./python.exe -m timeit -s a = 'hundred' if 'x' in a: a.replace('x', 'y')
bash-3.2$ ./python.exe -m timeit -s a = 'hunxred' a.replace('x', 'y')
./python.exe -m timeit -s a = 'hunxred' a.replace('x', 'y')
bash-3.2$ ./python.exe -m timeit -s a = 'hunxred' if 'x' in a:
a.replace('x', 'y')
./python.exe -m timeit -s a = 'hunxred' if 'x' in a: a.replace('x', 'y')
--
components: Interpreter Core
messages: 181741
nosy: gvanrossum
priority: normal
severity: normal
status: open
title: string replace is too slow
type: performance
versions: Python 3.2
___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue17170
___
___
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com