[PyOV] Optimize dtype to Type conversion (#24588)

### Details:
- Remove costly conversion to string by replacing it with unique ids of
each dtype.
- More on `dtype.num`:
https://numpy.org/devdocs/reference/generated/numpy.dtype.num.html#numpy.dtype.num

### Tickets:
 - *...*
This commit is contained in:
Jan Iwaszkiewicz 2024-05-21 17:50:04 +02:00 committed by GitHub
parent c76b5f2776
commit 0c65b35bb8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 35 additions and 31 deletions

View File

@ -198,13 +198,10 @@ endif()
# Build the code
#
if(Python3_VERSION_MINOR GREATER_EQUAL 11)
set(pybind11_min_version 2.9.2)
else()
set(pybind11_min_version 2.8.0)
endif()
if(CMAKE_CROSSCOMPILING)
set(pybind11_min_version 2.12.0)
else()
set(pybind11_min_version 2.10.0)
endif()
# search for FindPython3.cmake instead of legacy modules
set(PYBIND11_FINDPYTHON ON)

View File

@ -37,24 +37,34 @@ py::dtype get_dtype(const ov::element::Type& ov_type) {
return ov_type_to_dtype().at(ov_type);
}
const std::map<std::string, ov::element::Type>& dtype_to_ov_type() {
static const std::map<std::string, ov::element::Type> dtype_to_ov_type_mapping = {
{"float16", ov::element::f16},
{"float32", ov::element::f32},
{"float64", ov::element::f64},
{"int8", ov::element::i8},
{"int16", ov::element::i16},
{"int32", ov::element::i32},
{"int64", ov::element::i64},
{"uint8", ov::element::u8},
{"uint16", ov::element::u16},
{"uint32", ov::element::u32},
{"uint64", ov::element::u64},
{"bool", ov::element::boolean},
{"bytes_", ov::element::string},
{"str_", ov::element::string},
{"bytes", ov::element::string},
{"str", ov::element::string},
const std::map<int, ov::element::Type>& dtype_num_to_ov_type() {
static const std::map<int, ov::element::Type> dtype_to_ov_type_mapping = {
{23, ov::element::f16}, // float16
{11, ov::element::f32}, // float32
{12, ov::element::f64}, // float64
{1, ov::element::i8}, // int8
{3, ov::element::i16}, // int16
#ifdef _WIN32
{7, ov::element::i32}, // int32
{9, ov::element::i64}, // int64
#else
{5, ov::element::i32}, // int32
{7, ov::element::i64}, // int64
#endif
{2, ov::element::u8}, // uint8
{4, ov::element::u16}, // uint16
#ifdef _WIN32
{8, ov::element::u32}, // uint32
{10, ov::element::u64}, // uint64
#else
{6, ov::element::u32}, // uint32
{8, ov::element::u64}, // uint64
#endif
{0, ov::element::boolean}, // bool
{18, ov::element::string}, // bytes_
{19, ov::element::string}, // str_
{18, ov::element::string}, // bytes
{19, ov::element::string}, // str
};
return dtype_to_ov_type_mapping;
}
@ -66,7 +76,7 @@ ov::element::Type get_ov_type(const py::array& array) {
if (ctype == 'U' || ctype == 'S') {
return ov::element::string;
}
return dtype_to_ov_type().at(py::str(array.dtype()));
return dtype_num_to_ov_type().at(array.dtype().num());
}
ov::element::Type get_ov_type(py::dtype& dtype) {
@ -76,7 +86,7 @@ ov::element::Type get_ov_type(py::dtype& dtype) {
if (ctype == 'U' || ctype == 'S') {
return ov::element::string;
}
return dtype_to_ov_type().at(py::str(dtype));
return dtype_num_to_ov_type().at(dtype.num());
}
}; // namespace type_helpers

View File

@ -47,7 +47,7 @@ const std::map<ov::element::Type, py::dtype>& ov_type_to_dtype();
py::dtype get_dtype(const ov::element::Type& ov_type);
const std::map<std::string, ov::element::Type>& dtype_to_ov_type();
const std::map<int, ov::element::Type>& dtype_num_to_ov_type();
ov::element::Type get_ov_type(const py::array& array);

View File

@ -25,13 +25,10 @@ set(PYBIND_FE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/mock_mo_python_api.cpp)
source_group("src" FILES ${PYBIND_FE_SRC})
if(Python3_VERSION_MINOR GREATER_EQUAL 11)
set(pybind11_min_version 2.9.2)
else()
set(pybind11_min_version 2.8.0)
endif()
if(CMAKE_CROSSCOMPILING)
set(pybind11_min_version 2.12.0)
else()
set(pybind11_min_version 2.10.0)
endif()
# search for FindPython3.cmake instead of legacy modules
set(PYBIND11_FINDPYTHON ON)