diff options
author | Helmut Grohne <helmut@subdivi.de> | 2021-12-29 21:00:04 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2021-12-29 21:00:04 +0100 |
commit | 69a8861b704c969260ecb55110d8e41cd9aaf0a7 (patch) | |
tree | bc508bc46be90509978ddb2e7fb77b630a21be80 | |
parent | e118de84d60e6f0d7662dcbb6aa362f452dda6ba (diff) | |
download | debian-dedup-69a8861b704c969260ecb55110d8e41cd9aaf0a7.tar.gz |
webapp: speed up encode_and_buffer
We now know that our parameter is a jinja2.environment.TemplateStream.
Enable buffering and accumulate via an io.BytesIO to avoid O(n^2)
append.
-rwxr-xr-x | webapp.py | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -3,6 +3,7 @@ import argparse import contextlib import datetime +import io import sqlite3 from wsgiref.simple_server import make_server @@ -49,15 +50,16 @@ hash_template = jinjaenv.get_template("hash.html") index_template = jinjaenv.get_template("index.html") source_template = jinjaenv.get_template("source.html") -def encode_and_buffer(iterator): - buff = b"" - for elem in iterator: - buff += elem.encode("utf8") - if len(buff) >= 2048: - yield buff - buff = b"" - if buff: - yield buff +def encode_and_buffer(stream): + stream.enable_buffering(16) + buff = io.BytesIO() + for elem in stream: + buff.write(elem.encode("utf8")) + if buff.tell() >= 2048: + yield buff.getvalue() + buff = io.BytesIO() + if buff.tell() > 0: + yield buff.getvalue() def html_response(unicode_iterator, max_age=24 * 60 * 60): resp = Response(encode_and_buffer(unicode_iterator), mimetype="text/html") |