argparse.ArgumentParser is slow when parsing a very long option list
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 25/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Stack technique
- python
- Domaine
- cli, performance
Piste de recherche
Commencez avec argparse.ArgumentParser et parse_args(), en utilisant la reproduction répétée de --item=x dans l’issue pour observer la montée en charge. Examinez les PR liés pour repérer les travaux qui traitent déjà ce comportement. C’est terminé lorsque l’analyse d’une très longue liste d’options ne présente plus la croissance O(N^2) signalée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug report
The following parser exhibits O(N^2) behavior when parsing a very long option list (e.g. --item=a --item=b ...):
parser = argparse.ArgumentParser(description="test")
parser.add_argument('--item', dest='accumulate', action='append')
Here is a simple repro that measures the time parse_args() take depending on the number of options:
#!/usr/bin/env python3
import argparse
from datetime import datetime
def run_test(num_iterations):
"""Parse a list with 'append' action and measure the time it takes."""
parser = argparse.ArgumentParser(description="test")
parser.add_argument('--item', dest='accumulate', action='append')
start = datetime.now()
args = parser.parse_args(['--item=x' for _ in range(num_iterations)])
end = datetime.now()
diff = end - start
print(f"{num_iterations:8} iterations: {diff} s")
def main():
for i in range(8, 18):
run_test(pow(2, i))
if __name__ == "__main__":
main()
The output on my machine:
> ./repro.py
256 iterations: 0:00:00.002699 s
512 iterations: 0:00:00.008444 s
1024 iterations: 0:00:00.028508 s
2048 iterations: 0:00:00.104813 s
4096 iterations: 0:00:00.389232 s
8192 iterations: 0:00:01.552962 s
16384 iterations: 0:00:06.132139 s
32768 iterations: 0:00:25.233547 s
65536 iterations: 0:01:51.921170 s
131072 iterations: 0:07:42.047914 s
Your environment
- CPython versions tested on: HEAD of main (a9d58feccfd956dc99195af6872b06446738d7db)
- Operating system and architecture: Fedora release 36 (Thirty Six)
Linked PRs
- gh-124740
- gh-124745
- gh-124909
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 36k
- Merge moyen
- 1 j 9 h
- PR mergées (30 j)
- 558
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/cpython
-
docs pending
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
build type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
stdlib topic-email type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Toutes les issues de python/cpython
Issues similaires
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
bancolombia/sentinel#23 ·
-
test md OuverteCI
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100