1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
"""
A quick and rough performance comparison of text vs. binary Decimal adaptation
"""
from random import randrange
from decimal import Decimal
import psycopg
from psycopg import sql
ncols = 10
nrows = 500000
format = psycopg.pq.Format.BINARY
test = "copy"
def main() -> None:
cnn = psycopg.connect()
cnn.execute(
sql.SQL("create table testdec ({})").format(
sql.SQL(", ").join(
[
sql.SQL("{} numeric(10,2)").format(sql.Identifier(f"t{i}"))
for i in range(ncols)
]
)
)
)
cur = cnn.cursor()
if test == "copy":
with cur.copy(f"copy testdec from stdin (format {format.name})") as copy:
for j in range(nrows):
copy.write_row(
[Decimal(randrange(10000000000)) / 100 for i in range(ncols)]
)
elif test == "insert":
ph = ["%t", "%b"][format]
cur.executemany(
"insert into testdec values (%s)" % ", ".join([ph] * ncols),
(
[Decimal(randrange(10000000000)) / 100 for i in range(ncols)]
for j in range(nrows)
),
)
else:
raise Exception(f"bad test: {test}")
if __name__ == "__main__":
main()
|