Python中的一行、多行循环与矢量化

2024-04-25 23:45:55 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中的单行循环只能用于构建列表吗?(即列出理解),还是可以用于更一般的计算?

例如,我知道Python中的列表理解(~单行循环),例如

my_list = [ 2*i for i in range(10)]

也可以使用多线回路构建:

my_list = []
for i in range(10):
    my_list.append(2*i)

但是,我们能否始终将一般的多行循环转换为一行循环?

例如,假设我们有以下多行For循环:

my_array = np.ones(10*10)

for x in range(10):
     my_array[x,:] = 0

我们能把它转换成一个单行循环吗?更一般地说:

Q1.这两种形式在功能上是等价的吗?(即,它们支持相同的操作/操作集)

Q2.我想我以前读过,Python中的单行循环是向量化的。这是真的吗?这是否意味着它们可以比多行循环更快地迭代?


Tags: in功能列表formynponesrange
2条回答

But can we we always transform general multi-line loops in Python into one-line loops?

简短的回答是不

列表理解有利于投影(映射)和/或过滤。

例如,如果您有这样的代码:

result = []
for x in seq:
    if bar(x):
        result.append(foo(x))

然后,正如您所指出的,它可以从重写为列表理解中受益:

result = [foo(x) for f in seq if bar(x)]

然而,对于不适合这种投影或过滤模式的操作,列表理解通常不是很好。

例如,如果需要对元素进行变异,但不需要结果,那么列表理解就不合适。以下代码不方便作为列表理解来编写(假设两个方法都返回None):

for x in seq:
    x.foo()    # Modify x
    x.bar()    # Modify x again

有些操作是不允许在理解中进行的。一个例子是,如果满足某个条件,则会提前脱离循环:

for x in seq:
    if x.foo():
        break
    else:
        x.bar()

我要指出的一点是,这不仅仅是列表,你可以用理解来创建集合,甚至字典。

>>> {i**2 for i in range(5)}
set([0, 1, 4, 16, 9])
>>> {i : str(i) for i in range(5)}
{0: '0', 1: '1', 2: '2', 3: '3', 4: '4'}

此外,列表理解通常比多次使用append(如您的示例)要快,因为理解是由底层C代码完成的,而不是有额外Python层的append

当然,理解和其他东西一样有局限性。如果希望对列表/集的每个元素执行一组更大的操作,那么正常循环可能更合适。

相关问题 更多 >