import timeit
from collections import deque
import numpy as np

def measure_execution_time(circuit, state, repeat=100, **kwargs):
    results = deque()
    for _ in range(repeat):

        s = state.deepcopy()
        start = timeit.default_timer()
        result = circuit * s
        stop = timeit.default_timer()

        results.append(stop - start)
    return min(results)


def execution_statistics(circuits, state, scale=1, **kwargs):
    results = deque()

    for circuit in circuits:
        results.append(measure_execution_time(circuit, state, **kwargs))

    results = np.array(results, dtype=np.double)
    results /= scale
    N = len(results)
    avg = np.average(results)
    std_dev = np.std(results) / np.sqrt(N)

    return N, avg, std_dev