pybind11 icon indicating copy to clipboard operation
pybind11 copied to clipboard

Keyword argument handling performance optimization.

Open kkimdev opened this issue 5 years ago • 3 comments

Issue description

Keyword argument handling is slower than CPython.

CPython has an optimization that assumes the keyword name string objects are interned and performs pointer comparisons first instead https://github.com/python/cpython/blob/22424c02e51fab3b62cbe255d0b87d1b55b9a6c3/Python/ceval.c#L3975 .

Whereas Pybind constructs string objects and hashes them https://github.com/pybind/pybind11/blob/fb910ae92b4a489e9b31f9ec545bde9d09d6a40e/include/pybind11/pybind11.h#L518 .

What do you think about having a similar optimization in Pybind?

Reproducible example code

void matmul(py::handle a,
            py::handle b,
            py::handle transpose_a,
            py::handle transpose_b,
            py::handle adjoint_a,
            py::handle adjoint_b,
            py::handle a_is_sparse,
            py::handle b_is_sparse,
            py::handle name) {
}
 
PYBIND11_MODULE(test, m) {
 m.def("matmul", &matmul,
       py::arg("a"),
       py::arg("b"),
       py::arg("transpose_a") = false,
       py::arg("transpose_b") = false,
       py::arg("adjoint_a") = false,
       py::arg("adjoint_b") = false,
       py::arg("a_is_sparse") = false,
       py::arg("b_is_sparse") = false,
       py::arg("name") = "");
}
test.matmul(1, 2, transpose_a = True)

kkimdev avatar Jan 01 '20 09:01 kkimdev

This is interesting and worth looking into.

bstaletic avatar Jul 07 '20 13:07 bstaletic

Relates #2760 which benchmarking of alternative implementations, provided via @rwgk and @kkimdev - thanks! https://github.com/pybind/pybind11/issues/2760#issuecomment-752776314

EricCousineau-TRI avatar Dec 31 '20 17:12 EricCousineau-TRI

I'm encountering a similar issue. My focus is on caching compile-time string literals to enhance the efficiency of my program.

XuehaiPan avatar Nov 29 '23 11:11 XuehaiPan