Bộ thử nghiệm không cố gắng sử dụng phần nhập khẩu, timeit
vì vậy thật khó để biết ý định đó là gì. Tuy nhiên, đây là một câu trả lời kinh điển nên một ví dụ hoàn chỉnh về timeit
dường như theo thứ tự, xây dựng trên câu trả lời của Martijn .
Các tài liệu đểtimeit
cung cấp nhiều ví dụ và cờ đáng để kiểm tra. Cách sử dụng cơ bản trên dòng lệnh là:
$ 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
Chạy với -h
để xem tất cả các tùy chọn. Python MOTW có một phần tuyệt vời trên timeit
đó cho thấy cách chạy các mô-đun thông qua các chuỗi mã nhập và đa dòng từ dòng lệnh.
Ở dạng kịch bản, tôi thường sử dụng nó như thế này:
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")
Bạn có thể dễ dàng thả các hàm và đối số bạn cần. Hãy thận trọng khi sử dụng các chức năng không tinh khiết và chăm sóc nhà nước.
Đầu ra mẫu:
$ 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
? Tôi đoán là không. Trong trường hợp đó, có lẽ bạn nên xóa "với thời gian Pythons" khỏi tiêu đề.