Python 列表理解的 O(n) 复杂度与 zip() 函数
O(n) complexity of Python list comprehension with zip() function
我目前正在学习使用以下代码的教程:
# 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 循环一样工作吗?那么列表理解本身呢?
感谢您的帮助!
你在列表 A
、B
、condition
上迭代一次,每一步都向 answer
添加一个元素,所以复杂度是 O(n)
其中 n
是最短列表的大小
Does every variable passed to zip() act like another for-loop?
将其视为一个循环,向 zip
添加 1 个参数将在每次迭代中添加 O(1)
,或在所有 n
次迭代中添加 O(n)
。 (假设最小参数的大小为 n
)
例如,对于 zip(X1,X2,...,Xm)
,您正在做 O(mn)
工作,但是 m
是常数,所以它是 O(n)
。 (再次假设参数的最小大小是 n
)
zip(*args)
的运行时间是O(len(args) * min(len(a) for a in args)
。如果没有对参数的特定假设(例如,列表的数量 (len(args)
) 是恒定的),您不一定能将其归结为 O(n)
。
现在,您通常可以做出这样的假设。如果列表的长度都相同,您可以使用单个长度 n
代替最小长度计算,并使用 m
代表列表的数量,并将其写为 O(m * n)
。如果列表的数量不会改变,那么 m
的因子是一个常数并且可以被删除,只留下 O(n)
.
但是如果您不能做出那些特定的假设,那么将其视为 O(n)
可能会误导您。
如果一个列表有时可以比其他列表短,那么较长列表的长度并不重要,因为 zip
永远不会生成它们的最后一项。如果列表数量可变,则不能忽略 m
项。
我目前正在学习使用以下代码的教程:
# 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 循环一样工作吗?那么列表理解本身呢?
感谢您的帮助!
你在列表 A
、B
、condition
上迭代一次,每一步都向 answer
添加一个元素,所以复杂度是 O(n)
其中 n
是最短列表的大小
Does every variable passed to zip() act like another for-loop?
将其视为一个循环,向 zip
添加 1 个参数将在每次迭代中添加 O(1)
,或在所有 n
次迭代中添加 O(n)
。 (假设最小参数的大小为 n
)
例如,对于 zip(X1,X2,...,Xm)
,您正在做 O(mn)
工作,但是 m
是常数,所以它是 O(n)
。 (再次假设参数的最小大小是 n
)
zip(*args)
的运行时间是O(len(args) * min(len(a) for a in args)
。如果没有对参数的特定假设(例如,列表的数量 (len(args)
) 是恒定的),您不一定能将其归结为 O(n)
。
现在,您通常可以做出这样的假设。如果列表的长度都相同,您可以使用单个长度 n
代替最小长度计算,并使用 m
代表列表的数量,并将其写为 O(m * n)
。如果列表的数量不会改变,那么 m
的因子是一个常数并且可以被删除,只留下 O(n)
.
但是如果您不能做出那些特定的假设,那么将其视为 O(n)
可能会误导您。
如果一个列表有时可以比其他列表短,那么较长列表的长度并不重要,因为 zip
永远不会生成它们的最后一项。如果列表数量可变,则不能忽略 m
项。