python的timeit模块显示时间怎么那么长?

socket 发布于 2013/07/30 23:22
阅读 1K+
收藏 1

代码如下:

>>> timeit.timeit('x=[i for i in range(100)]')
7.16868471899943
给一个list赋值怎么会用7秒这么长??直接用time来测时间代码如下:
>>> import time
>>> def fun():
...     t0=time.time()
...     x=[i for i in range(100)]
...     t1=time.time()
...     t=t1-t0
...     print(t)
... 
>>> fun()
4.38690185546875e-05
显示是0.0000438秒,这是怎么回事?是我timeit用错了还是怎么回事儿?还有,用time模块测时间不好吗?我看有种说法是"python自己带着电池",所以推荐用timeit模块,可是为什么是不准的呢?


--------------------------------分割线-----------------------------

感谢 @李学明 的详解,搞明白了,number设为1代码如下:

>>> timeit.timeit('x=[i for i in range(100)]',number=1)
3.778500013140729e-05
比用time要快一点点,说明time是不准的,以后测程序运行时间还是用timeit模块~非常感谢~~

加载中
2
李学明
李学明
timeit方法有一个默认参数number, 默认值为 1000000, 这个参数标示表达式要执行多少次, 所以timeit统计的时间是执行1000000次的时间。

性能分析建议使用cProfile模块, python -m cProfile your.py就可以了。

顺便附上楼主两个代码的profile。

timeit版

1000022 function calls in 7.749 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <timeit-src>:2(<module>)
        1    6.920    6.920    7.744    7.744 <timeit-src>:2(inner)
        1    0.003    0.003    7.749    7.749 test.py:1(<module>)
        1    0.000    0.000    0.000    0.000 timeit.py:105(Timer)
        1    0.000    0.000    0.000    0.000 timeit.py:121(__init__)
        1    0.000    0.000    7.744    7.744 timeit.py:178(timeit)
        1    0.000    0.000    7.744    7.744 timeit.py:225(timeit)
        1    0.002    0.002    0.002    0.002 timeit.py:53(<module>)
        2    0.000    0.000    0.000    0.000 timeit.py:90(reindent)
        1    0.000    0.000    0.000    0.000 {compile}
        1    0.000    0.000    0.000    0.000 {gc.disable}
        1    0.000    0.000    0.000    0.000 {gc.enable}
        1    0.000    0.000    0.000    0.000 {gc.isenabled}
        1    0.000    0.000    0.000    0.000 {globals}
        2    0.000    0.000    0.000    0.000 {isinstance}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        2    0.000    0.000    0.000    0.000 {method 'replace' of 'str' objects}
  1000000    0.824    0.000    0.824    0.000 {range}
        2    0.000    0.000    0.000    0.000 {time.time}
time版

6 function calls in 0.001 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.001    0.001 test2.py:1(<module>)
        1    0.000    0.000    0.000    0.000 test2.py:2(fun)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {range}
        2    0.000    0.000    0.000    0.000 {time.time}



socket
socket
谢谢~~非常长知识~~太感谢了~
0
我是泥瓦匠
我是泥瓦匠

引用来自“李学明”的评论

timeit方法有一个默认参数number, 默认值为 1000000, 这个参数标示表达式要执行多少次, 所以timeit统计的时间是执行1000000次的时间。

性能分析建议使用cProfile模块, python -m cProfile your.py就可以了。

顺便附上楼主两个代码的profile。

timeit版

1000022 function calls in 7.749 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <timeit-src>:2(<module>)
        1    6.920    6.920    7.744    7.744 <timeit-src>:2(inner)
        1    0.003    0.003    7.749    7.749 test.py:1(<module>)
        1    0.000    0.000    0.000    0.000 timeit.py:105(Timer)
        1    0.000    0.000    0.000    0.000 timeit.py:121(__init__)
        1    0.000    0.000    7.744    7.744 timeit.py:178(timeit)
        1    0.000    0.000    7.744    7.744 timeit.py:225(timeit)
        1    0.002    0.002    0.002    0.002 timeit.py:53(<module>)
        2    0.000    0.000    0.000    0.000 timeit.py:90(reindent)
        1    0.000    0.000    0.000    0.000 {compile}
        1    0.000    0.000    0.000    0.000 {gc.disable}
        1    0.000    0.000    0.000    0.000 {gc.enable}
        1    0.000    0.000    0.000    0.000 {gc.isenabled}
        1    0.000    0.000    0.000    0.000 {globals}
        2    0.000    0.000    0.000    0.000 {isinstance}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        2    0.000    0.000    0.000    0.000 {method 'replace' of 'str' objects}
  1000000    0.824    0.000    0.824    0.000 {range}
        2    0.000    0.000    0.000    0.000 {time.time}
time版

6 function calls in 0.001 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.001    0.001 test2.py:1(<module>)
        1    0.000    0.000    0.000    0.000 test2.py:2(fun)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {range}
        2    0.000    0.000    0.000    0.000 {time.time}



timeit 如果写是写文件呢,怎么获取时间。

f.write(result) 使用timeit 怎么获取写入文件所花销的时间。

返回顶部
顶部