Evaluating a mathematical [removed]function) for a large number of input values fast

前端 未结 5 1622
你的背包
你的背包 2020-12-09 12:11

The following questions

  • Evaluating a mathematical expression in a string
  • Equation parsing in Python
  • Safe way to parse user-supplied
5条回答
  •  既然无缘
    2020-12-09 12:42

    I have used the C++ ExprTK library in the past with great success. Here is a benchmark speed test amongst other C++ parsers (e.g. Muparser, MathExpr, ATMSP etc...) and ExprTK comes out on top.

    There is a Python wrapper to ExprTK called cexprtk which I have used and have found to be very fast. You are able to compile the mathematical expression just once and then evaluate this serialised expression as many times as required. Here is a simple example code using cexprtk with the userinput_function:

    import cexprtk
    import time
    
    userinput_function = '5*(1-(x*0.1))' # String - numbers should be handled as floats
    demo_len = 20000 # Parameter for benchmark (20k to 30k in real life)
    
    time_start = time.time()
    x = 1
    
    st = cexprtk.Symbol_Table({"x":x}, add_constants = True) # Setup the symbol table
    Expr = cexprtk.Expression(userinput_function, st) # Apply the symbol table to the userinput_function
    
    for x in range(0,demo_len,1):
        st.variables['x'] = x # Update the symbol table with the new x value
        Expr() # evaluate expression
    time_end = time.time()
    
    print('1 cexprtk: ' + str(round(time_end - time_start, 4)) + ' seconds')
    

    On my machine (Linux, dual core, 2.5GHz), for a demo length of 20000 this completes in 0.0202 seconds.

    For a demo length of 2,000,000 cexprtk finishes in 1.23 seconds.

提交回复
热议问题