La suite de tests ne tente pas d'utiliser le fichier importé timeit, il est donc difficile de dire quelle était l'intention. Néanmoins, c'est une réponse canonique, donc un exemple complet de timeitsemble en ordre, élaborant sur la réponse de Martijn .
Les documents pourtimeit offrent de nombreux exemples et indicateurs à vérifier. L'utilisation de base sur la ligne de commande est:
$ python -mtimeit "all(True for _ in range(1000))"
2000 loops, best of 5: 161 usec per loop
$ python -mtimeit "all([True for _ in range(1000)])"
2000 loops, best of 5: 116 usec per loop
Exécutez avec -hpour voir toutes les options. Python MOTW a une grande section sur timeitqui montre comment exécuter des modules via l'importation et des chaînes de code multilignes à partir de la ligne de commande.
Sous forme de script, je l'utilise généralement comme ceci:
import argparse
import copy
import dis
import inspect
import random
import sys
import timeit
def test_slice(L):
L[:]
def test_copy(L):
L.copy()
def test_deepcopy(L):
copy.deepcopy(L)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--n", type=int, default=10 ** 5)
parser.add_argument("--trials", type=int, default=100)
parser.add_argument("--dis", action="store_true")
args = parser.parse_args()
n = args.n
trials = args.trials
namespace = dict(L = random.sample(range(n), k=n))
funcs_to_test = [x for x in locals().values()
if callable(x) and x.__module__ == __name__]
print(f"{'-' * 30}\nn = {n}, {trials} trials\n{'-' * 30}\n")
for func in funcs_to_test:
fname = func.__name__
fargs = ", ".join(inspect.signature(func).parameters)
stmt = f"{fname}({fargs})"
setup = f"from __main__ import {fname}"
time = timeit.timeit(stmt, setup, number=trials, globals=namespace)
print(inspect.getsource(globals().get(fname)))
if args.dis:
dis.dis(globals().get(fname))
print(f"time (s) => {time}\n{'-' * 30}\n")
Vous pouvez facilement supprimer les fonctions et les arguments dont vous avez besoin. Soyez prudent lorsque vous utilisez des fonctions impures et faites attention à l'état.
Exemple de sortie:
$ python benchmark.py --n 10000
------------------------------
n = 10000, 100 trials
------------------------------
def test_slice(L):
L[:]
time (s) => 0.015502399999999972
------------------------------
def test_copy(L):
L.copy()
time (s) => 0.01651419999999998
------------------------------
def test_deepcopy(L):
copy.deepcopy(L)
time (s) => 2.136012
------------------------------
timeit? Je suppose que non. Dans ce cas, vous devriez probablement supprimer "with Pythons timeit" du titre.