Python - 时差(JAX 库)
Python - time difference (JAX library)
我正在尝试比较函数之间的执行时间:
- simpleExponentialSmoothing - 这是我在 JAX 库中实现的 SES
- simpleExponentialSmoothingJax - 同上,但使用 JAX 库中的 JIT 进行了提升
- SimpleExpSmoothing - 来自 Statsmodels 库的实现
我尝试过使用 %timeit
、time
并编写自己的函数来使用 datetime 测量时间,但是我很困惑。我的时间测量函数和 %timeit
返回相同的执行时间,但是 %time
显示的执行时间有很大不同。我发现 %time
只检查单个 运行 并且不如 %timeit
准确,但它如何应用于 JAX 中的异步函数?虽然我一直屏蔽它们直到完成计算,但我不确定这是否足够。
我需要有关此措施的建议,我应该将哪个作为实际执行时间?
%时间
%time timeSeriesSes = simpleExponentialSmoothing(params, timeSeries, initState).block_until_ready()
%time timeSeriesSesJit = simpleExponentialSmoothingJit(params, timeSeries, initState).block_until_ready()
%time timeSeriesSesSm = SimpleExpSmoothing(timeSeries).fit()
CPU times: user 82.4 ms, sys: 4.03 ms, total: 86.4 ms
Wall time: 97.6 ms
CPU times: user 199 µs, sys: 0 ns, total: 199 µs
Wall time: 214 µs
CPU times: user 6.12 ms, sys: 0 ns, total: 6.12 ms
Wall time: 6.2 ms
%timeit
%timeit timeSeriesSes = simpleExponentialSmoothing(params, timeSeries, initState).block_until_ready()
%timeit timeSeriesSesJit = simpleExponentialSmoothingJit(params, timeSeries, initState).block_until_ready()
%timeit timeSeriesSesSm = SimpleExpSmoothing(timeSeries).fit()
48.8 ms ± 904 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
15.5 µs ± 222 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.4 ms ± 62.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
对于您的 JAX 特定问题:使用 block_until_ready()
应该足以说明 JAX 的异步执行。
还要注意 JIT 编译:第一次使用特定形状的参数调用 JIT 编译的函数时,编译时间会影响执行速度。之后会使用缓存的编译。
关于您更笼统的问题:%timeit
和 %time
之间的区别包含在 IPython 文档中:
By default, timeit()
temporarily turns off garbage collection during the timing. The advantage of this approach is that it makes independent timings more comparable. The disadvantage is that GC may be an important component of the performance of the function being measured.
(来自 https://docs.python.org/3/library/timeit.html#timeit.Timer.timeit)
因此,如果您想通过 Python 垃圾收集来衡量性能,并且只执行一次,请使用 %time
。如果您想在没有 Python 垃圾收集的情况下测量性能,并且为了更严格的统计而多次执行,请使用 %timeit
.
我正在尝试比较函数之间的执行时间:
- simpleExponentialSmoothing - 这是我在 JAX 库中实现的 SES
- simpleExponentialSmoothingJax - 同上,但使用 JAX 库中的 JIT 进行了提升
- SimpleExpSmoothing - 来自 Statsmodels 库的实现
我尝试过使用 %timeit
、time
并编写自己的函数来使用 datetime 测量时间,但是我很困惑。我的时间测量函数和 %timeit
返回相同的执行时间,但是 %time
显示的执行时间有很大不同。我发现 %time
只检查单个 运行 并且不如 %timeit
准确,但它如何应用于 JAX 中的异步函数?虽然我一直屏蔽它们直到完成计算,但我不确定这是否足够。
我需要有关此措施的建议,我应该将哪个作为实际执行时间?
%时间
%time timeSeriesSes = simpleExponentialSmoothing(params, timeSeries, initState).block_until_ready()
%time timeSeriesSesJit = simpleExponentialSmoothingJit(params, timeSeries, initState).block_until_ready()
%time timeSeriesSesSm = SimpleExpSmoothing(timeSeries).fit()
CPU times: user 82.4 ms, sys: 4.03 ms, total: 86.4 ms
Wall time: 97.6 ms
CPU times: user 199 µs, sys: 0 ns, total: 199 µs
Wall time: 214 µs
CPU times: user 6.12 ms, sys: 0 ns, total: 6.12 ms
Wall time: 6.2 ms
%timeit
%timeit timeSeriesSes = simpleExponentialSmoothing(params, timeSeries, initState).block_until_ready()
%timeit timeSeriesSesJit = simpleExponentialSmoothingJit(params, timeSeries, initState).block_until_ready()
%timeit timeSeriesSesSm = SimpleExpSmoothing(timeSeries).fit()
48.8 ms ± 904 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
15.5 µs ± 222 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.4 ms ± 62.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
对于您的 JAX 特定问题:使用 block_until_ready()
应该足以说明 JAX 的异步执行。
还要注意 JIT 编译:第一次使用特定形状的参数调用 JIT 编译的函数时,编译时间会影响执行速度。之后会使用缓存的编译。
关于您更笼统的问题:%timeit
和 %time
之间的区别包含在 IPython 文档中:
By default,
timeit()
temporarily turns off garbage collection during the timing. The advantage of this approach is that it makes independent timings more comparable. The disadvantage is that GC may be an important component of the performance of the function being measured.
(来自 https://docs.python.org/3/library/timeit.html#timeit.Timer.timeit)
因此,如果您想通过 Python 垃圾收集来衡量性能,并且只执行一次,请使用 %time
。如果您想在没有 Python 垃圾收集的情况下测量性能,并且为了更严格的统计而多次执行,请使用 %timeit
.