list ,set 和 frozenset的 区别

list的具体实现方法:见https://blog.csdn.net/lucky404/article/details/79596319 or 印象笔记 Python 列表源码解析

源码没看太懂,但是用实验的方式来看了一下list 中append, remove 和 set 中add 和 remove 的时间复杂度

import numpy as np

class TestTime:

    @classmethod
    def DuplicatesInSortedArray(cls, size = 1000):
        arr = []
        for i in range(size//2):
            arr.append(i)
            arr.append(i)
        return arr

    @classmethod
    def notSortedArray(cls, low = 1, high = 1000, size = 1000):
        return list(np.random.randint(low, high, size))
from TestTime import TestTime
from UsingArray.SortColors75 import Solution
import time

for i in range(15,25):
    size = 2 ** i
    nums = TestTime.notSortedArray(size=size)
    ll = set(nums)
    ll.add(1)
    # start = time.time()
    # nums.append(0)   #O(1)的时间复杂度
    # end = time.time()
    # print('size=',size, ' list append time=',end - start)

    # start = time.time()
    # nums.remove(nums[0])  # O(n)的时间复杂度
    # end = time.time()
    # print('size=', size, ' list remove time=', end - start)

    # start = time.time()
    # re = 10 in nums  #O(n)的时间复杂度,不太确定
    # end = time.time()
    # print('size=', size, ' list exits time=', end - start)

    # start = time.time()
    # ll.add(0)  # O(1)的时间复杂度
    # end = time.time()
    # print('size=', size, ' set add time=', end - start)

    start = time.time()
    re = 1 in ll  # O(1)的时间复杂度
    end = time.time()
    print('size=', size, ' set remove time=', end - start)

暂且认为:

list 中append的时间复杂度为O(1), insert 和remove的时间复杂度为O(n)(因为涉及到元素的移动)

      但是不能从实验数据中确定  x在list中(x in list)  的时间复杂度

set 中 add , remove ,x在set中(x in set) 的时间复杂度的时间复杂度为O(1)

set 和 frozenset 的区别为一个可变,有add和remove方法,一个不可变,没有add 和remove方法。

猜你喜欢

转载自blog.csdn.net/zhao_crystal/article/details/83377293