opteryx
opteryx copied to clipboard
✨ [ORSO] cythonize Row object
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]