Removing all overhead

  • Instead of eval in __call__ we may build a (lambda) function
    class StringFunction:
        def _build_lambda(self):
            s = 'lambda ' + ', '.join(self._var)
            # add parameters as keyword arguments:
            if self._prms:
                s += ', ' + ', '.join(['%s=%s' % (k, self._prms[k]) \
                                       for k in self._prms])
            s += ': ' + self._f
            self.__call__ = eval(s, self._globals)
    

  • For a call
    f = StringFunction('A*sin(x)*exp(-b*t)', A=0.1, b=1,
                       independent_variables=('x','t'))
    
    the s looks like
    lambda x, t, A=0.1, b=1: return A*sin(x)*exp(-b*t)
    

    previousnexttable of contents