timeit模块
timeit模块可以用来测试一小段Python代码的执行速度。
class timeit.Timer(stmt='pass', setup='pass', timer=
Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。
List的操作测试
import
timeit
def
test1
(
)
:
'''
通过append方法添加数据
'''
li
=
[
]
for
i
in
range
(
10000
)
:
li
.
append
(
i
)
def
test5
(
)
:
'''
通过insert方法添加数据
'''
li
=
[
]
for
i
in
range
(
10000
)
:
li
.
insert
(
0
,
i
)
def
test2
(
)
:
'''
通过列表相加添加数据
'''
li
=
[
]
for
i
in
range
(
10000
)
:
li
=
li
+
[
i
]
def
test3
(
)
:
'''
通过推导式添加数据
'''
li
=
[
i
for
i
in
range
(
10000
)
]
def
test4
(
)
:
'''
通过list方法添加数据
'''
li
=
list
(
range
(
10000
)
)
'''
因为timeit测试是另外开一个模块测试,所以第二参数中,需要导入要测试函数
当前模块的模块名称为= __main__
'''
timer1
=
timeit
.
Timer
(
'test1()'
,
'from __main__ import test1'
)
timer5
=
timeit
.
Timer
(
'test5()'
,
'from __main__ import test5'
)
timer2
=
timeit
.
Timer
(
'test2()'
,
'from __main__ import test2'
)
timer3
=
timeit
.
Timer
(
'test3()'
,
'from __main__ import test3'
)
timer4
=
timeit
.
Timer
(
'test4()'
,
'from __main__ import test4'
)
# 测试100次
print
(
'append :%f'
%
timer1
.
timeit
(
number
=
100
)
)
print
(
'insert :%f'
%
timer5
.
timeit
(
number
=
100
)
)
print
(
'[]+[] :%f'
%
timer2
.
timeit
(
number
=
100
)
)
print
(
'[i for] :%f'
%
timer3
.
timeit
(
number
=
100
)
)
print
(
'list() :%f'
%
timer4
.
timeit
(
number
=
100
)
)
''' 输出
append :0.171303
insert :2.461631
[]+[] :15.466849
[i for] :0.049168
list() :0.029723
'''
输出结果:
append
:
0.171303
insert
:
2.461631
[
]
+
[
]
:
15.466849
[
i
for
]
:
0.049168
list
(
)
:
0.029723
结论
来个列表相加[] + []操作是非常耗费时间
insert操作比较耗费时间
pop测试
x
=
range
(
2000000
)
pop_zero
=
Timer
(
"x.pop(0)"
,
"from __main__ import x"
)
print
(
"pop_zero "
,
pop_zero
.
timeit
(
number
=
1000
)
,
"seconds"
)
x
=
range
(
2000000
)
pop_end
=
Timer
(
"x.pop()"
,
"from __main__ import x"
)
print
(
"pop_end "
,
pop_end
.
timeit
(
number
=
1000
)
,
"seconds"
)
# ('pop_zero ', 1.9101738929748535, 'seconds')
# ('pop_end ', 0.00023603439331054688, 'seconds')
测试pop操作:从结果可以看出,pop最后一个元素的效率远远高于pop第一个元素
list内置操作的时间复杂度
操作 | 时间复杂度 | 描述 |
---|---|---|
index[] | O(1) | index[索引] 查找操作 |
index赋值 | O(1) | index[索引] = 值 赋值操作 |
append | O(1)) | append追加操作 |
pop() | O(1) | pop()方法操作的 |
pop(i) | O(n) | n为操作list的size |
insert(i,item) | O(n) | n为list的size |
del操作 | O(n) | n为list的size |
iteration | O(n) | n为list的size. 遍历操作 |
contains | O(n) | n为list的size |
dict内置操作的时间复杂度
操作 | 时间复杂度 | 描述 |
---|---|---|
copy | O(n) | 浅拷贝操作 n为dict的size |
get item | O(1) | 获取字典值 |
set item | O(1)) | 这是字典值 |
delete item | O(1) | 删除字典值 |
iteration | O(n) | n为dictt的size. 遍历操作 |
contains | O(1)) | n为list的size |