two-way for `str.rfind`
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Feature or enhancement
Proposal:
After closing with: https://github.com/python/cpython/pull/120025#issuecomment-5281829097
I appreciate that str.rfind is much less frequently used than str.find. But as can be seen it the PR above, it is fairly easy to make two_way bi-directional to handle both. I concluded that for standard track Horspool algorithm the cost of bi-directional logic is best avoided - those methods are fairly short and simple. However, two-way is a plausible candidate I think. Having separate functions for both direction would mean very large code duplications and I think paying a small perf cost to keep single logic for both might be a fairly good deal.
I think it would be good to do it - single string search is one of the most important low level algorithms - having this space clean and complete is I think a good thing -- it would give peace of mind for developers and predictable behaviour for users, and library developers who make heavy use of string search, allowing to derive new algorithms that work in both directions without performance surprises when running in reverse.
There is a workaround of course:
idx = str[::-1].find(sub[::-1])
if idx != -1:
idx = len(str) - len(sub) - idx
However, for small problem sizes this is a non-trivial overhead + double memory.
So, what are the thoughts of others?
Is adapting two-way search to serve str.rfind (eliminating its O(n^2) worst case) desirable/worthwhile?
cc @methane @rhettinger @serhiy-storchaka @vstinner
Has this already been discussed elsewhere?
No response given
Links to previous discussion of this feature:
No response
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
Comience con el punto de entrada str.rfind y la lógica de búsqueda two_way existente que se analiza en el pull request enlazado. Compare los requisitos de las búsquedas hacia delante y hacia atrás y, a continuación, evalúe si el procesamiento bidireccional puede evitar el peor caso O(n^2) de str.rfind sin un coste de rendimiento inaceptable ni funciones duplicadas. Se considera terminado cuando el diseño está acordado y se han validado su comportamiento y sus ventajas y desventajas.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- performance
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Tranquilo
- Claridad
- Necesita aclaración
- Aptitud para principiantes
- 35/100