Python 时间和空间复杂性比较:通过循环或dict(zip(s,t))向dict添加两个列表的元素

Python 时间和空间复杂性比较:通过循环或dict(zip(s,t))向dict添加两个列表的元素,python,dictionary,time,time-complexity,complexity-theory,Python,Dictionary,Time,Time Complexity,Complexity Theory,我是python新手,正在尝试理解时间和空间复杂性的概念。我想把两张相同长度的单子写下来。我可以通过以下两种方式做到这一点: 1) 通过循环列表并将其添加到dict: dictLists = {} for i in range(0,len(list1)): dictLists[list1[i]] = list2[i] 2) 通过压缩列表,然后从中生成一个dict: dictZip = dict(zip(list1,list2)) 据我所

我是python新手,正在尝试理解时间和空间复杂性的概念。我想把两张相同长度的单子写下来。我可以通过以下两种方式做到这一点:

1) 通过循环列表并将其添加到dict:

 dictLists = {}
        for i in range(0,len(list1)):
            dictLists[list1[i]] = list2[i]
2) 通过压缩列表,然后从中生成一个dict:

       dictZip = dict(zip(list1,list2))
据我所知,第一种方法的时间复杂度应该是O(N),其中N是列表的长度。但是,我不知道第二个选项的时间复杂度,除了zip操作本身需要O(1)个时间复杂度


这两种方法在时间复杂度上有什么不同?由于一个额外的zip对象,第二种方法是否会增加空间复杂度?

两者都具有相同的时间和空间复杂度。它们各自都有各自的开销,这些开销在谈论复杂性时不包括在内,比如你提到的
zip
对象和你没有提到的
range
对象,所有在阴影中发生的函数调用

在实践中,这些并不重要,因此不要过早地进行微优化(“过早”在这里是指没有充分的理由预期性能问题,没有遇到性能问题,也没有基准测试)-选择可读选项
dict(zip(list1,list2))


附言

除了zip操作本身需要O(1)时间复杂性这一事实


创建一个
zip
是O(1),但在其所有元素上迭代的元素数是O(N)。

由于python是一种动态解释语言,需要在运行时确定变量的类型,因此在运行时实现代码的方式可能会有明显的不同。例如,在第一个解决方案中,python需要在每次迭代中计算出“i”的类型(可以使用cython进行修复),因此这会降低程序的速度。尽管如此,您可能不会注意到,通过少量的迭代。正如您在测试台上所看到的,第一种方法几乎慢了4倍

import time
list1 = [x for x in range(1000000)]
list2 = [x for x in range(1000000)]

dictLists = dict()
l = len(list1)

s = time.time()
for i in range(0, l):
    dictLists[list1[i]] = list2[i]
print(f"Time: {time.time()-s}")
# 0.39275574684143066

dictLists = dict()
s = time.time()

dictZip = dict(zip(list1,list2))
print(f"Time: {time.time()-s}")
# 0.09296393394470215