'Function prints provided statistics
:param stats: Dictionary with statistics
:param functions: Functions to be executed on statistics
:param output: Object which provides display method for printing
:param nskip: Number of measurements to be skipped in functions'

@staticmethod
def print_stats(stats, functions=None, output=None, nskip=0):

    if (not stats):
        raise ValueError('Provide    stats')
    if (not output):
        output = neon_logger
    elif (not hasattr(output, 'display')):
        raise TypeError('Argument    output    must    implement    display    method')
    if (not functions):
        functions = (np.mean, np.median, np.min, np.max)
    function_names = tuple((function.__name__.title() for function in functions))
    fmt_titles = (('|    {name:^33}    '.format(name='Func') + ('|    {:^11}    ' * len(function_names))) + '|                Units                |')
    fmt_nums = (('|    {func:<33}    ' + (('|        {%s:<10.5g}    ' * len(function_names)) % function_names)) + '|    {units:^11}    |')
    head_str = fmt_titles.format(*function_names)
    sep = (('+' + ('-' * (len(head_str) - 2))) + '+')
    msg = '\n{sep:}\n|{prefix:-^105}|\n'.format(sep=sep, prefix=('        Intel    Neon    Benchmark:    0.0.1    Neon    Version:    %s        ' % __neon_version__[:5]))
    msg += ('%s\n%s\n%s\n' % (sep, head_str, sep))
    out_stats = {}
    for step in stats:
        timesu = np.array(stats[step][nskip:])
        out_stats[step] = {}
        for function in functions:
            out_stats[step][function.__name__.title()] = function(timesu)
        msg += ('%s\n' % fmt_nums.format(units='msec', func=step, **out_stats[step]))
    msg += sep
    output.display(msg)
