From: Daniele Varrazzo Date: Wed, 22 Apr 2020 16:55:11 +0000 (+1200) Subject: Avoid creating an intermadiate tuple X-Git-Tag: 3.0.dev0~545 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e2be4d904a0699fc0b007b044a7e18b84b9c128;p=thirdparty%2Fpsycopg.git 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. --- 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]]