简单感受下Python内置数据类型常用操作的性能


生成一个列表的几种方式的性能对比

# -*- coding: utf-8 -*-

from timeit import Timer
import matplotlib.pyplot as plt

# 列表常用操作性能测试

# 迭代 + '+'
def test1():
    l = []
    for i in range(1000):
        l = l + [i]


# 迭代 + append
def test2():
    l = []
    for i in range(1000):
        l.append(i)

# 列表生成式
def test3():
    l = [i for i in range(1000)]

# list构造函数 + range
def test4():
    l = list(range(1000))

t1 = Timer("test1()", "from __main__ import test1")
# print("concat %f seconds" % t1.timeit(number=1000))

t2 = Timer("test2()", "from __main__ import test2")
# print("concat %f seconds" % t2.timeit(number=1000))

t3 = Timer("test3()", "from __main__ import test3")
# print("concat %f seconds" % t3.timeit(number=1000))

t4 = Timer("test4()", "from __main__ import test4")
# print("concat %f seconds" % t4.timeit(number=1000))

result = [t1.timeit(1000), t2.timeit(1000), t3.timeit(1000), t4.timeit(1000)]
method = ["for+ '+'", "for + append", "list comprehension", "list + range"]

plt.bar(method, result, color='rgby')

# plt.legend('concat time')
# print(zip(method, result))

for x,y in zip(method, result):
    plt.text(x, y, "%fs" % y)

plt.show()

Cost time

list和dict的检索效率对比

# -*- coding: utf-8 -*-

import random
from timeit import Timer
import matplotlib.pyplot as plt

lst_result = []
d_result = []

for i in range(10000,1000001,20000):
    t = 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)

    lst_result.append(lst_time)
    d_result.append(d_time)
    print("%d,%10.3f,%10.3f" % (i, lst_time, d_time))

test = [i for i in range(10000,1000001,20000)]

plt.plot(test, lst_result, 'ro')
plt.plot(test, d_result, 'bo')

plt.legend(['List','Dictionary'])

plt.show()

result plot

del list[index]与del dict[key] 性能对比

average time complexity:$ O(n)\ \ vs\ \ O(1) $

# -*- coding: utf-8 -*-

import random
from timeit import Timer
import matplotlib.pyplot as plt


size = 20000


l_result = []
d_result = []

for i in range(size):
    test_list = [i for i in range(size)]
    list_t = Timer("del test_list[%d]" % i,"from __main__ import test_list")
    list_result = list_t.timeit(number=1)
    l_result.append(list_result)

    test_dict = {j:None for j in range(size)}
    dict_t = Timer("del test_dict[%d]" % i,"from __main__ import test_dict")
    dict_result = dict_t.timeit(number=1)
    d_result.append(dict_result)

    # print("%d,%f,%f" % (i, list_result, dict_result))

plt.plot(range(size), l_result)
plt.plot(range(size), d_result)

plt.legend(['del list[index]', 'del dict[key]'])

plt.show()

result

参考


 上一篇
使用Microsoft Edge Beta将网页变成应用 使用Microsoft Edge Beta将网页变成应用
今天无聊的我打开了装了很久都没用的Microsoft Edge Beta,一波乱戳,惊讶的发现Microsoft Edge Beta居然有将网页打包为应用的功能😂 B站也有PC”客户端”了,真香😂
2019-10-11
下一篇 
Python环境管理与项目依赖管理 Python环境管理与项目依赖管理
个人简单记录下 virtualenv + pip virtualenv是一个用于创建”隔离的ython运行环境”的工具,Docspip是Python的包管理工具,Docs # 安装virtualenv pip install virt
2019-09-02
  目录