带有zip()函数的Python列表理解的O(n)复杂度

时间:2019-01-30 15:59:11

标签: python python-3.x numpy time-complexity complexity-theory

我目前正在使用以下代码来完成本教程:

# numpy where
A = np.array([1,2,3,4])
B = np.array([100, 200, 300, 400])
condition = np.array([True, True, False, False])

answer = [(A_val if cond else B_val) for A_val, B_val, cond in zip(A, B, condition)]

answer
# Out: [1, 2, 300, 400]

问题:此python这种结构的复杂性是什么,列表推导和zip()函数的混合?

传递给zip()的每个变量是否都像另一个for循环一样?列表理解本身又如何呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

您要遍历列表ABcondition,一旦完成每个步骤,就将元素添加到answer中,因此复杂度为O(n)其中n是最短列表的大小

  

传递给zip()的每个变量是否都像另一个for循环一样?

将其视为一个循环,向zip添加1个参数将在每次迭代中添加O(1),或在所有O(n)迭代中添加n。 (假设最小参数的大小为n
例如,对于zip(X1,X2,...,Xm),您正在做O(mn)工作,但是m是常量,因此它是O(n)。 (再次假设参数的最小大小为n

答案 1 :(得分:1)

zip(*args)的运行时间为O(len(args) * min(len(a) for a in args)。如果没有关于参数的特定假设(例如,列表(O(n)的数目是恒定的)),则不必将其简化为len(args)

现在,您经常可以做出这样的假设。如果列表长度相同,则可以使用该单个长度n代替最小长度计算,并使用m代表列表数,并将其写为{ {1}}。如果列表的数量不变,则O(m * n)的因数是一个常数,可以删除,仅保留m

但是,如果您无法做出这些特定的假设,则将其视为O(n)可能会误导您。

如果一个列表有时可以短于其他列表,则较长列表的长度无关紧要,因为O(n)永远不会产生它们的最后一项。如果列表的数量是可变的,那么您就不能忽略zip这个词。