File: compression.py

package info (click to toggle)
python-websockets 15.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,948 kB
  • sloc: python: 25,105; javascript: 350; ansic: 148; makefile: 43
file content (45 lines) | stat: -rw-r--r-- 1,606 bytes parent folder | download
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
#!/usr/bin/env python

"""
Profile the permessage-deflate extension.

Usage::
    $ pip install line_profiler
    $ python experiments/compression/corpus.py experiments/compression/corpus
    $ PYTHONPATH=src python -m kernprof \
        --line-by-line \
        --prof-mod src/websockets/extensions/permessage_deflate.py \
        --view \
        experiments/profiling/compression.py experiments/compression/corpus 12 5 6

"""

import pathlib
import sys

from websockets.extensions.permessage_deflate import PerMessageDeflate
from websockets.frames import OP_TEXT, Frame


def compress_and_decompress(corpus, max_window_bits, memory_level, level):
    extension = PerMessageDeflate(
        remote_no_context_takeover=False,
        local_no_context_takeover=False,
        remote_max_window_bits=max_window_bits,
        local_max_window_bits=max_window_bits,
        compress_settings={"memLevel": memory_level, "level": level},
    )
    for data in corpus:
        frame = Frame(OP_TEXT, data)
        frame = extension.encode(frame)
        frame = extension.decode(frame)


if __name__ == "__main__":
    if len(sys.argv) < 2 or not pathlib.Path(sys.argv[1]).is_dir():
        print(f"Usage: {sys.argv[0]} <directory> [<max_window_bits>] [<mem_level>]")
    corpus = [file.read_bytes() for file in pathlib.Path(sys.argv[1]).iterdir()]
    max_window_bits = int(sys.argv[2]) if len(sys.argv) > 2 else 12
    memory_level = int(sys.argv[3]) if len(sys.argv) > 3 else 5
    level = int(sys.argv[4]) if len(sys.argv) > 4 else 6
    compress_and_decompress(corpus, max_window_bits, memory_level, level)