Skip to content

Combining the argument-conversion loops in _PyEval_Vector #160679

Open

Description

@ashm-dev

Feature or enhancement

In _PyEval_Vector, positional and keyword argument values are converted to _PyStackRef in separate loops. Both loops call PyStackRef_FromPyObjectNew.

The values are consecutive in args, and total_args already includes both groups. I replaced the two loops locally with:

for (size_t i = 0; i < total_args; i++) {
    arguments[i] = PyStackRef_FromPyObjectNew(args[i]);
}

This removes the duplicated conversion code and the second kwnames check. Conversion order and reference ownership stay the same. _PyEvalFramePushAndInit still receives the positional count, argcount, and kwnames separately.

The test suite passes with the change.

Is there a reason to keep the positional and keyword conversions separate?
Is there a reason to keep the positional and keyword conversions separate?

P.S. Even with -O3 -march=native, the compiler (gcc-16 and clang-23) leaves these as two separate loops in the optimized IR (LLVM IR | GCC GIMPLE), including the second kwnames check and keyword-count load. This suggests a small performance optimization opportunity, rather than just a source-code cleanup.

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

https://discuss.python.org/t/combining-the-argument-conversion-loops-in-pyeval-vector/109635

Activity

  1. sergey-miryanov commented on Oct 25, 2026

    @sergey-miryanov
    Contributor

    This suggests a small performance optimization opportunity

    Can we measure the speedup?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)type-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions