pybind11
pybind11 copied to clipboard
Keyword argument handling performance optimization.
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)
This is interesting and worth looking into.
Relates #2760 which benchmarking of alternative implementations, provided via @rwgk and @kkimdev - thanks! https://github.com/pybind/pybind11/issues/2760#issuecomment-752776314
I'm encountering a similar issue. My focus is on caching compile-time string literals to enhance the efficiency of my program.