Das Schlimmste, was man machen kann, sind Tests der Performance im Debug-Modus.
Um die Geschwindigkeit der Serialisierung zu testen, kann man sich Testdaten generieren.
Wenn deine API-Endpunkte weniger als 17576 Datensätze ausliefern, liegt das Problem nicht bei der Serialisierung.
Code: Alles auswählen
17576 Datensätze
json: 14.3 ms ± 203 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
ujson: 10.2 ms ± 73.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
sqlite3: 11.4 µs ± 552 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
(Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz)
Das Ergebnis von
sqlite3 ist wahrscheinlich verfälscht. Ich gehe von aus, dass dort ein Cache verwendet wird.
Code (ipython wird genutzt):
Code: Alles auswählen
import itertools
import string
import random
import json
import sqlite3
from pathlib import Path
import ujson
uni = lambda: random.uniform(0, 20)
data = [
{"id": idx, "name": f"Name {''.join(name)}", "price": round(price, 2)}
for idx, name, price in zip(
itertools.count(1),
itertools.product(*[string.ascii_uppercase] * 3),
iter(uni, None),
)
]
test_db = Path("test-db.sqlite")
test_db.unlink(missing_ok=True)
db = sqlite3.connect(test_db)
cur = db.cursor()
with db:
cur.execute("CREATE TABLE data (id integer, name string, price float);")
db.commit()
cur.executemany("INSERT INTO data VALUES (:id, :name, :price);", data)
raw_data = json.dumps(data)
print(f"{len(data)} Datensätze")
print("json: ", end="")
get_ipython().run_line_magic('timeit', 'json.loads(raw_data)')
print("ujson: ", end="")
get_ipython().run_line_magic('timeit', 'ujson.loads(raw_data)')
print("sqlite3: ", end="")
get_ipython().run_line_magic('timeit', 'cur.execute("SELECT * FROM data;")')
Wenn deine API-Endpunkte viele Datenbank-Abfragen tätigen, solltest du dir über Caching Gedanken machen.
Du solltest auch jeden Fall ein Profiling der API-Endpunkte machen.
Wie das geht, wird z.B. hier beschrieben:
https://codingshower.com/profiling-pyth ... -profiler/
Code: Alles auswählen
from flask import Flask
from werkzeug.middleware.profiler import ProfilerMiddleware
app = Flask(__name__)
app.wsgi_app = ProfilerMiddleware(app.wsgi_app)
@app.get("/")
def index():
return "42"
if __name__ == "__main__":
app.run()
Quelle:
w.py
Mit flask:
Mit gunicorn:
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server