1 列表
大O效率 | 操作 |
---|---|
O(1) | 索引、索引赋值、追加、pop() |
O(n) | pop(i)、insert(i, item)、删除、遍历、包含、删除切片、反转 |
O(k) | 切片、连接 |
O(n+k) | 设置切片 |
O(nlogn) | 排序 |
O(nk) | 乘法 |
- pop()性能分析
from timeit import Timer
popzero = Timer('x.pop(0)', 'from __main__ import x')
popend = Timer('x.pop()', 'from __main__ import x')
print('pop(0) pop()')
for i in range(1000000, 10000001, 1000000):
x = list(range(i))
pt = popend.timeit(number=1000)
x = list(range(i))
pz = popzero.timeit(number=1000)
print('%.5f, %.5f' % (pz, pt))
# 运行结果
pop(0) pop()
1.25220, 0.00012
1.99995, 0.00010
2.96982, 0.00011
4.09143, 0.00011
5.83050, 0.00011
6.50595, 0.00012
7.84172, 0.00012
8.18907, 0.00012
9.03335, 0.00011
10.02631, 0.00012
2 字典
大O效率 | 操作 |
---|---|
O(1) | 取值、赋值、删除、包含 |
O(n) | 复制、遍历 |
- 比较字典和列表的包含操作
import timeit
import random
print('i list dict')
for i in range(10000, 500001, 20000):
t = timeit.Timer('random.randrange(%d) in x' % i, 'from __main__ import random, x')
x = list(range(i))
lst_time = t.timeit(number=1000)
x = {j: None for j in range(i)}
d_time = t.timeit(number=1000)
print('%5d %5.5f %5.5f' % (i, lst_time, d_time))
# 运行结果
i list dict
10000 0.09079 0.00131
30000 0.28847 0.00204
50000 0.45092 0.00139
70000 0.59384 0.00160
90000 0.75567 0.00146
110000 0.88593 0.00145
130000 1.11990 0.00213
150000 1.23805 0.00164
170000 1.47041 0.00159
190000 1.60363 0.00174
210000 1.80491 0.00151
230000 1.99112 0.00158
250000 2.08052 0.00156
270000 2.24449 0.00181
290000 2.43446 0.00164
310000 2.54795 0.00178
330000 2.79199 0.00160
350000 2.98672 0.00165
370000 3.17383 0.00179
390000 3.30775 0.00169
410000 3.56335 0.00163
430000 3.55808 0.00161
450000 3.76099 0.00162
470000 3.96405 0.00172
490000 4.13248 0.00161
3 大O性能的预测与实验
代码一:
for i in range(n):
for j in range(n):
k = 2 + 2
# 此为嵌套循环,应该为O(n^2)
- 测试
from timeit import Timer
import matplotlib.pyplot as plt
def test1(n):
for i in range(n):
for j in range(n):
k = 2 + 2
plt.figure(figsize=(10, 10))
x = []
y = []
print('i test1')
for i in range(100, 10001, 100):
t = Timer('test1(i)', 'from __main__ import test1, i')
t1 = t.timeit(10)
print('%5d %5.5f' % (i, t1))
x.append(i)
y.append(t1)
font1 = {'family': 'Times New Roman',
'weight': 'normal',
'size': 23,
}
plt.plot(x, y)
plt.xlabel("i", font1)
plt.ylabel("time", font1)
plt.show()
- 结果
代码二:
for i in range(n):
k = 2 + 2
# 应该为O(n)
- 测试
from timeit import Timer
import matplotlib.pyplot as plt
def test1(n):
for i in range(n):
k = 2 + 2
plt.figure(figsize=(10, 10))
x = []
y = []
print('i test1')
for i in range(1000, 30001, 1000):
t = Timer('test1(i)', 'from __main__ import test1, i')
t1 = t.timeit(1000)
print('%5d %5.5f' % (i, t1))
x.append(i)
y.append(t1)
font1 = {'family': 'Times New Roman',
'weight': 'normal',
'size': 23,
}
plt.plot(x, y)
plt.xlabel("i", font1)
plt.ylabel("time", font1)
plt.show()
- 结果
代码三:
i = n
while i > 0:
k = 2 + 2
i = i // 2
# 应该是O(logn)
- 测试
from timeit import Timer
import matplotlib.pyplot as plt
def test1(n):
i = n
while i > 0:
k = 2 + 2
i = i // 2
plt.figure(figsize=(10, 10))
x = []
y = []
print('i test1')
for i in range(100000, 100000001, 100000):
t = Timer('test1(i)', 'from __main__ import test1, i')
t1 = t.timeit(100000)
print('%5d %5.5f' % (i, t1))
x.append(i)
y.append(t1)
font1 = {'family': 'Times New Roman',
'weight': 'normal',
'size': 23,
}
plt.plot(x, y)
plt.xlabel("i", font1)
plt.ylabel("time", font1)
plt.show()
- 结果
数据略微有些波动,但大部分还是趋于logn