python高性能编程第3章——列表和元组读书笔记

    写高性能程序最重要的事情是了解你的数据结构所能提供的性能保证。

     只要我们的数据保存在连续的桶里且直到数据的顺序,就能一步O(1)定位到数据所在的桶,无论我们的桶多大。

     Python列表有一个内建的排序算法使用了Tim排序。它运用了多种算法,对于给定的数据,它使用探索法猜测哪个算法的性能最优(更确切地说,它混用了插入排序和合并排序算法)来达到这样的性能。

     列表和元组的主要区别在于,列表是动态的数组,它们可变且可以重设长度,而元组是静态的数组,它们不可变,内部数据一旦创建无法改变。元组缓存于python运行时环境,这意味着我们每次使用元组无需访问内核去分配内存。元组的不可改变性使其成为了一个非常轻量级的数据结构。这意味着存储它们不需要很多的内存开销,而且对它的操作非常直观。

      当一个大小为N的列表第一次需要添加数据时,python会创建一个新的列表,足够存放原来的N个元素以及额外需要添加的元素,不过实际分配的不是N,如果使用了1000 000个列表,每个列表包含10个元素,那么我们假设占用了10000 000个元素的内存,如果在构建的时候,使用了append操作,实际占用内存可能是16 000 000个元素。

      元组不支持append操作,但是可以将两个元组合并,此时复杂度是O(n),返回一个新分配的元组。元组的好处是资源缓存。Python是垃圾收集语言,当一个变量不再被使用时,python会将该变量使用的内存释放回操作系统,以供其他程序(或变量)使用。然而对于长度为1~20的元组,即使不再被使用,控件也会保留,待未来使用,这样可以避免和操作系统打交道。

import time

start = time.time()
for i in range(1):
    l = [0,1,2,3,4,5,6,7,8,9]
end = time.time()
print("列表创建时间",10*end-start)


start = time.time()
for i in range(1):
    l = (0,1,2,3,4,5,6,7,8,9)
end = time.time()
print("元组创建时间",10*end-start)

实验证明:列表创建时间大概比元祖创建时间慢5倍,但对于创建一个列表或一个元组,它们的创建时间几乎相同。

当你的数据有一个内在次序,使用列表和元组可以让速度更快,开销更低。另一方面,元组可以迅速被创建,且无须列表的额外开销,代价则是不可修改。




猜你喜欢

转载自blog.csdn.net/ma412410029/article/details/80509422