# -*- coding: utf-8 -*-
"""
:githublink:`%|py|6`
"""
import timeit
import pandas
[docs]def unit(x):
"""
Optimizes the rendering of time.
.. runpython::
:showcode:
from jupytalk.benchmark.mlprediction import unit
print(unit(34))
print(unit(3.4))
print(unit(0.34))
print(unit(0.034))
print(unit(0.0034))
print(unit(0.00034))
print(unit(0.000034))
print(unit(0.0000034))
print(unit(0.00000034))
:githublink:`%|py|28`
"""
if x >= 1:
return "%1.2f s" % x
elif x >= 1e-3:
return "%1.2f ms" % (x * 1000)
elif x >= 1e-6:
return "%1.2f µs" % (x * 1000**2)
elif x >= 1e-9:
return "%1.2f ns" % (x * 1000**3)
else:
return "%1.2g s" % x
[docs]def timeexec(legend, code, number=50, repeat=200, verbose=True, context=None):
"""
Measures the time for a given expression.
:param legend: name of the experiment
:param code: code to measure (as a string)
:param number: number of time to run the expression
(and then divide by this number to get an average)
:param repeat: number of times to repeat the computation
of the above average
:param verbose: print the time
:param globals: context (usuable equal to ``globals()``)
:return: dictionary
.. runpython::
:showcode:
from jupytalk.benchmark.mlprediction import timeexec
code = "3 * 45535266234653452"
print(timeexec("multiplication", code))
:githublink:`%|py|62`
"""
if context is None:
context = globals()
rep = timeit.repeat(code, number=number, repeat=repeat, globals=context)
ave = sum(rep) / (number * repeat)
std = (sum((x / number - ave)**2 for x in rep) / repeat)**0.5
fir = rep[0] / number
fir3 = sum(rep[:3]) / (3 * number)
las3 = sum(rep[-3:]) / (3 * number)
rep.sort()
mini = rep[len(rep) // 20] / number
maxi = rep[-len(rep) // 20] / number
if verbose:
print("Average: %s deviation %s (with %d runs) in [%s, %s]" % (
unit(ave), unit(std), number, unit(mini), unit(maxi)))
return dict(legend=legend, average=ave, deviation=std, first=fir, first3=fir3,
last3=las3, repeat=repeat, min5=mini, max5=maxi, code=code, run=number)
[docs]def make_dataframe(labels, arrays):
"""
Builds a dataframe from multiple arrays.
:param labels: list of labels
:param arrays: list of arrays (or one array)
:return: dataframes
:githublink:`%|py|88`
"""
if labels is not None:
df = [pandas.DataFrame(data={'Label': labels})]
else:
df = []
if isinstance(arrays, list):
for i, ar in enumerate(arrays):
d = pandas.DataFrame(
data=ar, columns=["F%d_%d" % (i, j) for j in range(ar.shape[1])])
df.append(d)
else:
ar = arrays
d = pandas.DataFrame(
data=ar, columns=["F%d" % j for j in range(ar.shape[1])])
df.append(d)
return pandas.concat(df, axis=1)