File: ordered_set_benchmark.py

package info (click to toggle)
orderly-set 5.5.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 252 kB
  • sloc: python: 1,840; makefile: 3
file content (128 lines) | stat: -rw-r--r-- 4,132 bytes parent folder | download | duplicates (2)
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
121
122
123
124
125
126
127
128
def main():
    import timeit
    from functools import partial
    from random import randint

    from ordered_set import OrderedSet as OS1
    from orderly_set import OrderedSet as OS2
    from orderly_set import StableSet as OS3
    from orderly_set import OrderlySet as OS5
    from orderly_set import SortedSet as OS6
    # from sortedcollections import OrderedSet as OS4

    item_count = 10_000
    item_range = item_count * 2
    items = [randint(0, item_range) for _ in range(item_count)]
    items_b = [randint(0, item_range) for _ in range(item_count)]

    oset1a = OS1(items)
    oset2a = OS2(items)
    oset1b = OS1(items_b)
    oset2b = OS2(items_b)
    assert oset1a.difference(oset1b) == oset2a.difference(oset2b)
    assert oset1a.intersection(oset1b) == oset2a.intersection(oset2b)

    oset1c = OS1(items)
    oset2c = OS2(items)
    oset1c.add(item_range + 1)
    oset2c.add(item_range + 1)
    assert oset1c == oset2c

    for i in range(item_range):
        assert (i in oset1a) == (i in oset2a)
        if i in oset1a:
            assert oset1a.index(i) == oset2a.index(i)


    def init_set(T, items) -> set:
        return T(items)


    def init_set_list(T, items) -> list:
        return list(T(items))


    def init_set_d(items) -> dict:
        return dict.fromkeys(items)


    def init_set_d_list(items) -> list:
        return list(dict.fromkeys(items))


    def update(s: set, items) -> set:
        s.update(items)
        return s

    def update_and_get_item(set_type: set, items, items_b) -> set:
        set_ = set_type(items)
        if set_:
            set_[0]
        set_.update(items_b)
        set_[0]
        return set_

    def update_d(s: dict, items) -> dict:
        d2 = dict.fromkeys(items)
        s.update(d2)
        return s


    def symmetric_diff(s: set, s2: set) -> dict:
        return s ^ s2


    def diff(s: set, s2: set) -> dict:
        return s - s2


    orderly_sets_types = [OS1, OS2, OS3, OS5, OS6]  # OS4 is too slow
    orderly_set_type_names = ['ordered_set.OrderedSet', 'orderly_set.OrderedSet', 'StableSet', 'OrderlySet', 'SortedSet']  # 'sortedcollections.OrderedSet' is too slow
    set_types = [set] + orderly_sets_types
    set_type_names = ['set'] + orderly_set_type_names

    oss = [init_set(T, items) for T in set_types]
    oss_b = [init_set(T, items_b) for T in set_types]
    od = init_set_d(items)

    osls = [init_set_list(T, items) for T in set_types[1:-1]] + [init_set_d_list(items)]
    for x in osls:
        assert osls[0] == x

    osls = [update(init_set(T, items), items_b) for T in orderly_sets_types[:-1]] + [
        update_d(init_set_d(items), items_b)
    ]
    osls = [list(x) for x in osls]
    for x in osls:
        assert osls[0] == x

    number = 10000
    repeats = 3
    for i in range(repeats):
        print(f"----- series {i} ------")

        # print("-- initialize a set --")
        # print(f"Using Python dict time: {timeit.timeit(partial(init_set_d, items),number=number)}")
        # for idx, T in zip(set_type_names, set_types):
        #     print(f"{idx} time: {timeit.timeit(partial(init_set, T, items),number=number)}")

        # print("-- update a set --")
        # print(f"Using Python dict: {timeit.timeit(partial(update_d, od, items_b),number=number)}")
        # for idx, os in zip(set_type_names, oss):
        #     print(f"{idx} time: {timeit.timeit(partial(update, os, items_b),number=number)}")

        print("-- update a set and get item --")
        for idx, os in zip(orderly_set_type_names, orderly_sets_types):
            print(f"{idx} time: {timeit.timeit(partial(update_and_get_item, os, items, items_b),number=number)}")

        print("-- set symmetric difference (xor) --")
        for idx, set1, set2 in zip(set_type_names, oss, oss_b):
            print(f"{idx} time: {timeit.timeit(partial(symmetric_diff, set1, set2),number=number)}")

        print("-- set difference (-) --")
        for idx, set1, set2 in zip(set_type_names, oss, oss_b):
            print(f"{idx} time: {timeit.timeit(partial(diff, set1, set2),number=number)}")


if __name__ == '__main__':
    main()