【问题标题】:O(n) complexity of Python list comprehension with zip() function使用 zip() 函数的 Python 列表理解的 O(n) 复杂度
【发布时间】:2019-01-30 15:59:10
【问题描述】:

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

# 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 this 结构的复杂性是什么,它是列表理解和 zip() 函数的混合体?

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    您正在迭代列表A,B,condition 一次添加一个元素到answer 并采取每一步,所以复杂性是O(n) 其中n 是最短的大小列表

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

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

    【讨论】:

    • 谢谢!所以这意味着,无论我向 zip() 传递多少参数,执行 zip 总是 O(n),就像通过 for 循环迭代一次一样?
    • 仅当您传递预定(或恒定)数量的参数时,如 Blckknght 指出的那样。
    【解决方案2】:

    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 术语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2023-02-03
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多