From 4e2be4d904a0699fc0b007b044a7e18b84b9c128 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Thu, 23 Apr 2020 04:55:11 +1200 Subject: [PATCH] Avoid creating an intermadiate tuple We are now around 18x the basic Python performance [skip ci] Certain type conversion are stubbed out, so tests won't pass. --- psycopg3/transform.pyx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/psycopg3/transform.pyx b/psycopg3/transform.pyx index 3134d4985..24c87f840 100644 --- a/psycopg3/transform.pyx +++ b/psycopg3/transform.pyx @@ -252,27 +252,32 @@ cdef class Transformer: cdef libpq.PGresult *res = self._pgresult.pgresult_ptr - rv: List[Any] = [] cdef RowLoader *loader cdef int col cdef int length cdef const char *val + rv = cpython.PyTuple_New(self._nfields) for col in range(self._nfields): length = libpq.PQgetlength(res, crow, col) if length == 0: if libpq.PQgetisnull(res, crow, col): - rv.append(None) + cpython.Py_INCREF(None) + cpython.PyTuple_SET_ITEM(rv, col, None) continue val = libpq.PQgetvalue(res, crow, col) loader = self._row_loaders + col if loader.cloader is not NULL: - rv.append(loader.cloader(val, length, loader.context)) + pyval = loader.cloader(val, length, loader.context) else: # TODO: no copy - rv.append((loader.pyloader)(val[:length])) + pyval = (loader.pyloader)(val[:length]) - return tuple(rv) + cpython.Py_INCREF(pyval) + cpython.PyTuple_SET_ITEM(rv, col, pyval) + + + return rv def load_sequence( self, record: Sequence[Optional[bytes]] -- 2.47.2