ชุดทดสอบไม่ได้พยายามใช้การนำเข้าtimeit
ดังนั้นจึงยากที่จะบอกว่าเจตนาคืออะไร อย่างไรก็ตามนี่เป็นคำตอบที่ยอมรับได้ดังนั้นตัวอย่างที่สมบูรณ์ของtimeit
คำสั่งดูเหมือนจะอธิบายรายละเอียดของคำตอบของ Martijnคำตอบของ
เอกสารสำหรับtimeit
ข้อเสนอตัวอย่างมากมายและธงมูลค่าการตรวจสอบ การใช้งานพื้นฐานบนบรรทัดคำสั่งคือ:
$ 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
เรียกใช้ด้วย-h
เพื่อดูตัวเลือกทั้งหมด Python MOTWมีส่วนที่ยอดเยี่ยมtimeit
ที่แสดงวิธีการเรียกใช้โมดูลผ่านการอิมพอร์ตและสตริงโค้ดหลายบรรทัดจากบรรทัดคำสั่ง
ในรูปแบบสคริปต์ฉันมักจะใช้มันเช่นนี้:
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")
คุณสามารถวางฟังก์ชั่นและอาร์กิวเมนต์ที่คุณต้องการได้ง่ายๆ ใช้ความระมัดระวังเมื่อใช้ฟังก์ชั่นที่ไม่บริสุทธิ์และดูแลสถานะ
ตัวอย่างผลลัพธ์:
$ 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
อะไร ฉันเดาว่าไม่. ในกรณีนี้คุณควรลบ "with Pythons timeit" ออกจากชื่อ