为什么 timeit 将较慢的代码报告为较快的代码?
Why does timeit report slower code as faster one?
我在 Debian Stretch 中用 python 3.5 测试了这个。
我试过基准测试 the "Avoiding dots" optimization.
不出所料,the "Avoiding dots" optimization确实快多了。
出乎意料的是,timeit 将较慢的代码报告为较快的代码。
这是什么原因?
$ time python3 -m timeit -s "s=''" "s.isalpha()"
10000000 loops, best of 3: 0.119 usec per loop
real 0m5.023s
user 0m4.922s
sys 0m0.012s
$ time python3 -m timeit -s "isalpha=str.isalpha;s=''" "isalpha(s)"
1000000 loops, best of 3: 0.212 usec per loop
real 0m0.937s
user 0m0.927s
sys 0m0.000s
timeit
在“慢”情况下进行了 10 倍的 迭代 。它自适应地尝试更多迭代以找到平衡统计质量和等待时间的数字。
感谢。
让我们了解更多细节:
来自 python3 -m timeit -h
:
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
通过计算详细信息验证:
$ time python3 -m timeit -v -s "s=''" "s.isalpha()"
10 loops -> 3.44e-06 secs
100 loops -> 1.29e-05 secs
1000 loops -> 0.000117 secs
10000 loops -> 0.00116 secs
100000 loops -> 0.0118 secs
1000000 loops -> 0.116 secs
10000000 loops -> 1.17 secs
raw times: 1.21 1.21 1.21
10000000 loops, best of 3: 0.121 usec per loop
real 0m4.992s
user 0m4.977s
sys 0m0.012s
所有x loops -> y secs
时间总和用于确定合适的循环次数。
“原始时间”行中的每个项目都是单次重复计时器结果(the -r
option 确定“原始时间”行中的项目数)。
几乎所有时间都匹配:
>>> 3.44e-06+1.29e-05+0.000117+0.00116+0.0118+0.116+1.17+1.21+1.21+1.21
4.92909334
>>> 4.992-4.92909334
0.06290666000000034
我在 Debian Stretch 中用 python 3.5 测试了这个。
我试过基准测试 the "Avoiding dots" optimization.
不出所料,the "Avoiding dots" optimization确实快多了。
出乎意料的是,timeit 将较慢的代码报告为较快的代码。
这是什么原因?
$ time python3 -m timeit -s "s=''" "s.isalpha()"
10000000 loops, best of 3: 0.119 usec per loop
real 0m5.023s
user 0m4.922s
sys 0m0.012s
$ time python3 -m timeit -s "isalpha=str.isalpha;s=''" "isalpha(s)"
1000000 loops, best of 3: 0.212 usec per loop
real 0m0.937s
user 0m0.927s
sys 0m0.000s
timeit
在“慢”情况下进行了 10 倍的 迭代 。它自适应地尝试更多迭代以找到平衡统计质量和等待时间的数字。
感谢
让我们了解更多细节:
来自 python3 -m timeit -h
:
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
通过计算详细信息验证:
$ time python3 -m timeit -v -s "s=''" "s.isalpha()"
10 loops -> 3.44e-06 secs
100 loops -> 1.29e-05 secs
1000 loops -> 0.000117 secs
10000 loops -> 0.00116 secs
100000 loops -> 0.0118 secs
1000000 loops -> 0.116 secs
10000000 loops -> 1.17 secs
raw times: 1.21 1.21 1.21
10000000 loops, best of 3: 0.121 usec per loop
real 0m4.992s
user 0m4.977s
sys 0m0.012s
所有x loops -> y secs
时间总和用于确定合适的循环次数。
“原始时间”行中的每个项目都是单次重复计时器结果(the -r
option 确定“原始时间”行中的项目数)。
几乎所有时间都匹配:
>>> 3.44e-06+1.29e-05+0.000117+0.00116+0.0118+0.116+1.17+1.21+1.21+1.21
4.92909334
>>> 4.992-4.92909334
0.06290666000000034