Die Testsuite versucht nicht, das Importierte zu verwenden, timeit
daher ist es schwer zu sagen, was die Absicht war. Trotzdem ist dies eine kanonische Antwort, so dass ein vollständiges Beispiel für angebracht timeit
erscheint und Martijns Antwort näher erläutert wird .
Die Dokumentetimeit
bieten viele Beispiele und Flags, die es wert sind, überprüft zu werden. Die grundlegende Verwendung in der Befehlszeile lautet:
$ 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
Führen Sie mit aus -h
, um alle Optionen anzuzeigen. Python MOTW hat einen großartigen Abschnitt übertimeit
dem gezeigt wird, wie Module über Import- und mehrzeilige die Befehlszeile ausgeführt werden.
In Skriptform verwende ich es normalerweise so:
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")
Sie können ganz einfach die Funktionen und Argumente eingeben, die Sie benötigen. Seien Sie vorsichtig, wenn Sie unreine Funktionen verwenden, und achten Sie auf den Zustand.
Beispielausgabe:
$ 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
? Ich denke nicht. In diesem Fall sollten Sie wahrscheinlich "with Pythons timeit" aus dem Titel entfernen.