Skip to content

[BUG]: Time for name property on enum grows with enum size #5031

@niteria

Description

@niteria

Required prerequisites

What version (or hash if on master) of pybind11 are you using?

>=2.10.0, same as pybind/python_example

Problem description

The Enum.name property implemented in #1345 has an unexpected performance characteristic.
Namely the larger the enum the longer it takes.

I believe this function gets called

inline str enum_name(handle arg) {
and it's on average O(n) in the size of the enum.

The example is synthetic, but I've run into this being a problem in a real code base.

Reproducible example code

I've created a reproducible example here: https://github.com/niteria/python_example/tree/linear-enum-name-repro

It just wraps 3 different sizes of enums and measures the time taken by enum.name.

niteria/python_example@3b06300 is the only change on top of pybind/python_example.

To run:

~/tmp/python_example$ pip install .
~/tmp/python_example$ python test.py

Output on my computer:

$ python test.py 
Small time: 0.009021997451782227 seconds
Medium time: 0.31952929496765137 seconds
Large time: 3.216634511947632 seconds

Is this a regression? Put the last known working version here if it is.

Not a regression

Metadata

Metadata

Assignees

No one assigned

    Labels

    triageNew bug, unverified

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions