File: benchmark.py

package info (click to toggle)
python-evalidate 2.0.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 144 kB
  • sloc: python: 500; makefile: 3
file content (98 lines) | stat: -rwxr-xr-x 2,231 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
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
#!/usr/bin/env python3

from asteval import Interpreter
import timeit
import evalidate
import requests
import simpleeval
import json
from pprint import pprint

# context = {'a':1, 'b': 2}
# src="""a+b"""
# node = evalidate.evalidate(src)
# code = compile(node, '<usercode>', 'eval')

"""
    Our test: we prepare large list of products and filter it, find all items cheaper then 20
"""

mult = 10000
# mult = 1

products = requests.get('https://dummyjson.com/products?limit=100').json()['products'] * mult
accurate_counter = 8 * mult


# gi.symtable = context

def test_asteval():
    aeval = Interpreter()
    src = """
counter=0
for p in products:
    if p['price']<20:
        counter += 1
counter
    """
    aeval.symtable['products'] = products

    result = aeval(src)
    assert(result == accurate_counter)

def test_simpleeval():
    code = """price < 20"""

    s = simpleeval.SimpleEval()
    parsed = s.parse(code)

    counter = 0

    for p in products:
        s.names = p
        if s.eval(code, previously_parsed=parsed, ):
            counter += 1
    assert(counter == accurate_counter)

def evalidate_raw_eval():
    src="""price < 20"""
    e = evalidate.Expr(src)
    counter = 0

    for p in products:
        if eval(e.code, None, p):
            counter+=1
    assert(counter == accurate_counter)

def evalidate_eval():
    src="""price < 20"""
    e = evalidate.Expr(src)
    counter = 0

    for p in products:
        if e.eval(p):
            counter+=1

    assert(counter == accurate_counter)


def main():

    print(f"Products: {len(products)} items")


    t = timeit.timeit('evalidate_raw_eval()', setup='from __main__ import evalidate_raw_eval, products', number=1)
    print(f"evalidate_raw_eval(): {t:.3f}s")

    t = timeit.timeit('evalidate_eval()', setup='from __main__ import evalidate_eval, products', number=1)
    print(f"evalidate_eval(): {t:.3f}s")

    t = timeit.timeit('test_simpleeval()', setup='from __main__ import test_simpleeval, products', number=1)
    print(f"test_simpleeval(): {t:.3f}s")

    t = timeit.timeit('test_asteval()', setup='from __main__ import test_asteval, products', number=1)
    print(f"test_asteval(): {t:.3f}s")


if __name__ == '__main__':
    main()