opteryx icon indicating copy to clipboard operation
opteryx copied to clipboard

✨ [ORSO] cythonize Row object

Open joocer opened this issue 1 year ago • 0 comments

Perform some parts of the Row load and read using Cython to improve performance.

from cpython.tuple cimport PyTupleObject
from libc.string cimport strcmp

cdef class ExtendedTuple:
    cdef PyTupleObject* values
    cdef list field_names

    def __cinit__(self, tuple values, list field_names):
        assert len(values) == len(field_names), "Values and field names must have the same length"
        self.values = <PyTupleObject*> values
        self.field_names = field_names

    cpdef dict to_dict(self):
        cdef dict result = {}
        cdef int i
        for i in range(len(self.field_names)):
            result[self.field_names[i]] = self.values.ob_item[i]
        return result

    cpdef object get(self, object key):
        cdef int i
        for i in range(len(self.field_names)):
            if self.field_names[i] == key:
                return self.values.ob_item[i]
        raise KeyError("Key not found")

    def __getitem__(self, int index):
        if index < 0 or index >= len(self.field_names):
            raise IndexError("Index out of range")
        return self.values.ob_item[index]

    def __len__(self):
        return len(self.field_names)

    def __repr__(self):
        items = [f"{self.field_names[i]}={self.values.ob_item[i]!r}" for i in range(len(self.field_names))]
        return f"ExtendedTuple({', '.join(items)})"

    def __iter__(self):
        cdef int i
        for i in range(len(self.values)):
            yield self.values.ob_item[i]

joocer avatar Aug 21 '24 13:08 joocer