diff options
author | Amethyst Reese <amethyst@n7.gg> | 2024-03-01 02:52:53 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-01 11:52:53 +0100 |
commit | 4a630980328b67f0aba6a04c3950aa9dbd532895 (patch) | |
tree | 5dcd78b09e4967f71482ecdd4de9ed50eaa21038 /Lib/argparse.py | |
parent | 7b4794319c56b6b00e852c745af50fd95bd1a550 (diff) | |
download | cpython-4a630980328b67f0aba6a04c3950aa9dbd532895.tar.gz cpython-4a630980328b67f0aba6a04c3950aa9dbd532895.zip |
gh-116159: argparse: performance improvement parsing large number of options (#116162)
When parsing positional vs optional arguments, the use of min with a
list comprehension inside of a loop results in quadratic time based
on the number of optional arguments given. When combined with use of
prefix based argument files and a large number of optional flags, this
can result in extremely slow parsing behavior.
This replaces the min call with a simple loop with a short circuit to
break at the next optional argument.
Co-authored-by: Zsolt Dollenstein <zsol.zsol@gmail.com>
Diffstat (limited to 'Lib/argparse.py')
-rw-r--r-- | Lib/argparse.py | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py index 4200dd5e334..0dbdd67a82f 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -2153,10 +2153,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): while start_index <= max_option_string_index: # consume any Positionals preceding the next option - next_option_string_index = min([ - index - for index in option_string_indices - if index >= start_index]) + next_option_string_index = start_index + while next_option_string_index <= max_option_string_index: + if next_option_string_index in option_string_indices: + break + next_option_string_index += 1 if start_index != next_option_string_index: positionals_end_index = consume_positionals(start_index) |