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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions