]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Avoid creating an intermadiate tuple
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 22 Apr 2020 16:55:11 +0000 (04:55 +1200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 22 Apr 2020 17:05:32 +0000 (05:05 +1200)
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

index 3134d4985156dd80016737f9fc887bc1c6c1c5be..24c87f840a5b24cbb2f991038013a49b0c2a0f42 100644 (file)
@@ -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((<object>loader.pyloader)(val[:length]))
+                pyval = (<object>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]]