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()
|