Performance regression in `shlex.quote` from 3.13 to 3.14
Abierto
Nadie ha tomado este issue todavía.
3.14
3.15
performance
stdlib
type-bug
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Bug report
Bug description:
#132036 included an algorithmic change to shlex.quote that made it slower when the input has to be quoted. This is because the regular expression search was able to short-circuit at the first unsafe character.
However, the isascii check is worthwhile
Cc @picnixz
import re
import shlex
import timeit
# From 3.13
_find_unsafe = re.compile(r'[^\w@%+=:,./-]', re.ASCII).search
def old_quote(s):
"""Return a shell-escaped version of the string *s*."""
if not s:
return "''"
# BEST: if s.isascii() and _find_unsafe(s) is None:
if _find_unsafe(s) is None:
return s
# use single quotes, and put single quotes into double quotes
# the string $'b is then quoted as '$'"'"'b'
return "'" + s.replace("'", "'\"'\"'") + "'"
g = {'old_quote': old_quote, 'new_quote': shlex.quote}
print('with spaces')
print(' old', timeit.timeit("old_quote('the quick brown fox jumps over the lazy dog')", globals=g, number=1000000))
print(' new', timeit.timeit("new_quote('the quick brown fox jumps over the lazy dog')", globals=g, number=1000000))
print('without spaces')
print(' old', timeit.timeit("old_quote('thequickbrownfoxjumpsoverthelazydog')", globals=g, number=1000000))
print(' new', timeit.timeit("new_quote('thequickbrownfoxjumpsoverthelazydog')", globals=g, number=1000000))
print('non-ASCII')
print(' old', timeit.timeit("old_quote('mötley')", globals=g, number=1000000))
print(' new', timeit.timeit("new_quote('mötley')", globals=g, number=1000000))
print('short')
print(' old', timeit.timeit("old_quote('a')", globals=g, number=1000000))
print(' new', timeit.timeit("new_quote('a')", globals=g, number=1000000))
sample output:
with spaces
old 0.4148377259989502
new 0.5036935329990229
without spaces
old 0.3872929839999415
new 0.3540855330065824
ascii
old 0.4636239370011026
new 0.20726546400692314
short
old 0.1217202929983614
new 0.2977778149943333
CPython versions tested on:
3.14
Operating systems tested on:
Linux
Linked PRs
- gh-146408
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza por el punto de entrada shlex.quote y compara su comportamiento actual con la implementación de 3.13 mostrada en el informe. Revisa el PR vinculado gh-146408 y, después, usa los casos de timeit proporcionados para verificar que la regresión se ha corregido.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- cli
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100