summaryrefslogtreecommitdiff
path: root/examples/performance_test.py
blob: 3e64f2de9133026370bd440bdaa2a2651ebacc8a (plain)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
"""A manual test to compare performance of different serializers

Latest results:
---------------
CPU Results (x10000 iterations):
jsonpickle.encode:      8.846
jsonpickle.decode:      9.166
pickle.dumps:           0.433
pickle.loads:           0.734
cattrs.unstructure:     1.124
cattrs.structure:       1.048
cattrs+pickle.dumps:    1.219
cattrs+pickle.loads:    1.189
cattrs+json.dumps:      2.005
cattrs+json.loads:      2.312
cattrs+ujson.dumps:     1.803
cattrs+ujson.loads:     2.128
cattrs+bson.dumps: 1.550
cattrs+bson.loads: 1.322
"""
# flake8: noqa: F401
import json
import os
import pickle

import sys
from os.path import abspath, dirname, join
from time import perf_counter as time

import ujson
from cattr.preconf.json import make_converter

try:
    from rich import print
except ImportError:
    pass

# import jsonpickle
# from memory_profiler import profile

# Add project path
sys.path.insert(0, os.path.abspath('..'))

from requests_cache import CachedSession
from requests_cache.serializers import BaseSerializer, BSONSerializer, JSONSerializer, PickleSerializer

ITERATIONS = 10000

session = CachedSession()
r = session.get('https://httpbin.org/get?x=y')
r = session.get('https://httpbin.org/get?x=y')


# def test_jsonpickle():
#     base_test('jsonpickle', jsonpickle.encode, jsonpickle.decode)


def test_pickle():
    base_test('pickle', pickle.dumps, pickle.loads)


def test_cattrs():
    s = PickleSerializer()
    base_test('cattrs', s.unstructure, s.structure)


def test_cattrs_pickle():
    s = PickleSerializer()
    base_test('cattrs+pickle', s.dumps, s.loads)


def test_cattrs_json():
    s = BaseSerializer(converter_factory=make_converter)
    base_test(
        'cattrs+json',
        lambda obj: json.dumps(s.unstructure(obj)),
        lambda obj: s.structure(json.loads(obj)),
    )


def test_cattrs_ujson():
    s = BaseSerializer(converter_factory=make_converter)
    base_test(
        'cattrs+ujson',
        lambda obj: ujson.dumps(s.unstructure(obj)),
        lambda obj: s.structure(ujson.loads(obj)),
    )


def test_cattrs_bson():
    s = BSONSerializer()
    base_test('cattrs+bson', s.dumps, s.loads)


def base_test(module, serialize, deserialize):
    start = time()
    serialized = [serialize(r) for i in range(ITERATIONS)]
    print(f'{module}.{serialize.__name__} x{ITERATIONS}: {time() - start:.3f}')

    start = time()
    deserialized = [deserialize(obj) for obj in serialized]
    print(f'{module}.{deserialize.__name__} x{ITERATIONS}: {time() - start:.3f}')


if __name__ == '__main__':
    print('CPU:')
    # test_jsonpickle()
    test_pickle()
    test_cattrs()
    test_cattrs_pickle()
    test_cattrs_json()
    test_cattrs_ujson()
    test_cattrs_bson()

    # Memory
    # print('\nMemory:')
    # profile(test_jsonpickle)()
    # profile(test_pickle)()
    # profile(test_cattrs)()
    # profile(test_cattrs_pickle)()