单列表迭代与多个列表理解

ayd*_*dow 5 python list-comprehension python-2.7

我有一个数据列表,我需要将其中的一些元素复制到几个不同的列表中。对列表进行单次迭代或执行多个列表理解会更好吗

例如

def split_data(data):
    a = []
    b = []
    c = []
    for d in data:
        if d[0]   >   1 : a.append(d)
        if d[1]   == 'b': b.append(d)
        if len(d) ==  3 : c.append(d)

    return a, b, c
Run Code Online (Sandbox Code Playgroud)

相对

def split_data(data):
    a = [d for d in data if d[0]   >   1 ]
    b = [d for d in data if d[1]   == 'b']
    c = [d for d in data if len(d) ==  3 ]

    return a, b, c
Run Code Online (Sandbox Code Playgroud)

我知道更Pythonic的方法是使用列表理解,但在这种情况下是这种情况吗?

Sky*_*ycc 6

在第一个示例代码中,它只需要使用多个 if 语句迭代数据一次,而后面的代码需要迭代数据 3 次。我相信列表理解在大多数情况下会在数据迭代次数相同的情况下获胜。

对于像您的示例这样的简单操作,我更喜欢列表理解方法,当操作变得更复杂时,为了代码的可读性,也许其他方法会更好。

对 2 函数的一些基准测试应该会告诉您更多信息。基于我使用一些虚拟数据集对这两个函数进行的快速基准测试,运行时间如下。该运行时可能并不总是正确,具体取决于数据集

# without list comprehension
>>> timeit.timeit('__main__.split_data([("a","b")] * 1000000)', 'import __main__', number=1)
0.43826036048574224

# with list comprehension
>>> timeit.timeit('__main__.split_data([("a","b")] * 1000000)', 'import __main__', number=1)
0.31136326966964134
Run Code Online (Sandbox Code Playgroud)