什么时候在Python中使用列表理解变得低效?

时间:2014-11-06 18:42:26

标签: python python-2.7 python-3.x list-comprehension

我看到使用list comprehension提供了一种在Python中创建新列表的简单方法。

但是,如果不是创建一个新列表而只是想为列表中的每个参数调用一个void函数而不期望任何类型的返回值,我应该使用列表理解还是只使用for循环来迭代?代码的简单性是否适合为每组迭代创建一个新列表(即使它保持为空)?即使这些增加的成本在小型程序中可以忽略不计,在大型程序/生产中这样做是否有意义?

谢谢!

4 个答案:

答案 0 :(得分:3)

如果您实际上不需要列表,列表推导是错误的方式。请改用:

for i in seq:
    some_function(i)

与使用相比,这更有效,更具表现力:

[some_function(i) for i in seq]

请注意,有类似的东西不起作用(特别是它不是元组理解):

(some_function(i) for i in seq)

因为它只会创建一个迭代器。如果你实际传递一个只能迭代一次的列表,那么传递这样一个迭代器是一个更好的解决方案。

答案 1 :(得分:2)

for x in lst: f(x)

看起来同样短(实际上是一个字符更短)

[f(x) for x in lst]

或者那不是你想要做的吗?

答案 2 :(得分:1)

在列表的每个成员上调用函数还有更多可能的解决方案:

  • numpy可以向量化函数

    import numpy as np
    
    def func(i):
        print i
    
    v_func = np.vectorize(func)
    v_func(['one', 'two', 'three'])
    
  • python有一个内置的map函数,它在一个可迭代的每个成员上映射一个函数

    def func(i):
        print i
    map(func, ['one', 'two', 'three'])
    

答案 3 :(得分:0)

您是否在询问创建不需要的列表是否效率低下?这样,答案应该是显而易见的。

(为了满足答案警察:是的,创建一个你不需要的列表效率较低。)