From 5433c1a81b31b7806bab9b5c6eb022202bd24ea1 Mon Sep 17 00:00:00 2001 From: Martin Larralde <martin.larralde@embl.de> Date: Wed, 9 Oct 2024 01:08:00 +0200 Subject: [PATCH] Use faster `PyUnicode` functions to decode fixed-sized strings of `HMM` and `Profile` --- pyhmmer/plan7.pyx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/pyhmmer/plan7.pyx b/pyhmmer/plan7.pyx index 212f9147..2f7e1fc1 100644 --- a/pyhmmer/plan7.pyx +++ b/pyhmmer/plan7.pyx @@ -31,6 +31,7 @@ from cpython.unicode cimport ( PyUnicode_KIND, PyUnicode_READ, PyUnicode_GET_LENGTH, + PyUnicode_FromStringAndSize, ) from cpython.pythread cimport ( PyThread_type_lock, @@ -2676,7 +2677,7 @@ cdef class HMM: if not (self._hmm.flags & libhmmer.p7_hmm.p7H_CONS): return None assert self._hmm.consensus != NULL - return (&self._hmm.consensus[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._hmm.consensus[1], self._hmm.M) @property def consensus_structure(self): @@ -2689,7 +2690,7 @@ cdef class HMM: if not (self._hmm.flags & libhmmer.p7_hmm.p7H_CS): return None assert self._hmm.cs != NULL - return (&self._hmm.cs[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._hmm.cs[1], self._hmm.M) @property def consensus_accessibility(self): @@ -2702,7 +2703,7 @@ cdef class HMM: if not (self._hmm.flags & libhmmer.p7_hmm.p7H_CA): return None assert self._hmm.ca != NULL - return (&self._hmm.ca[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._hmm.ca[1], self._hmm.M) @property def reference(self): @@ -2719,7 +2720,7 @@ cdef class HMM: if not (self._hmm.flags & libhmmer.p7_hmm.p7H_RF): return None assert self._hmm.rf != NULL - return (&self._hmm.rf[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._hmm.rf[1], self._hmm.M) @property def model_mask(self): @@ -2732,7 +2733,7 @@ cdef class HMM: if not (self._hmm.flags & libhmmer.p7_hmm.p7H_MM): return None assert self._hmm.mm != NULL - return (&self._hmm.mm[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._hmm.mm[1], self._hmm.M) @property def description(self): @@ -4200,7 +4201,7 @@ cdef class OptimizedProfile: assert self._om != NULL if self._om.consensus[0] == b'\0': return None - return (&self._om.consensus[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._om.consensus[1], self._om.M) @property def consensus_structure(self): @@ -4212,7 +4213,7 @@ cdef class OptimizedProfile: assert self._om != NULL if self._om.cs[0] == b'\0': return None - return (&self._om.cs[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._om.cs[1], self._om.M) @property def reference(self): @@ -4229,7 +4230,7 @@ cdef class OptimizedProfile: assert self._om.rf != NULL if self._om.rf[0] == b'\0': return None - return (&self._om.rf[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._om.rf[1], self._om.M) @property def model_mask(self): @@ -4242,7 +4243,7 @@ cdef class OptimizedProfile: assert self._om.mm != NULL if self._om.mm[0] == b'\0': return None - return (&self._om.mm[1]).decode("ascii") + return PyUnicode_FromStringAndSize(&self._om.mm[1], self._om.M) # --- MSV Filter --- -- GitLab