python数据结构之大O性能

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

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值