timeit.repeat 即使一次操作也比 tic-toc 快得多?

timeit.repeat much faster than tic-toc even for one operation?

我有一个简单的函数 fun,我想测量它需要多长时间 并且 也会取回值。我认为 Python 的“tic-toc”是要走的路,但我注意到它比 timeit 慢得多(这不是 return 的值):

import numpy as np
import time
import timeit

np.random.seed(0)
x = np.random.rand(10000)

def fun():
    return np.sqrt(x)


t0_ns = time.time_ns()
fun()
t1_ns = time.time_ns()
print(t1_ns - t0_ns)


out = timeit.repeat(
  stmt=fun,
  repeat=1,
  number=1,
  timer=time.perf_counter_ns,
)
print(out[0])
58002
27037

事实上,timeit.repeat 比函数求值本身快两倍多!这是什么原因?有解决办法吗?

在此处推广 Peter Cordes 对答案的回复。

恢复订单时,

import numpy as np
import time
import timeit

np.random.seed(0)
x = np.random.rand(10000)


def fun():
    return np.sqrt(x)


out = timeit.repeat(
    stmt=fun,
    repeat=1,
    number=1,
    timer=time.perf_counter_ns,
)
print(out[0])

t0_ns = time.time_ns()
fun()
t1_ns = time.time_ns()
print(t1_ns - t0_ns)
36709
12623

第二次操作又快了。这表明执行速度与计时方法无关,而是与CPU预热效果有关。