预分配或不预先在Python中预分配列表

时间:2014-03-31 18:45:05

标签: python list obfuscation allocation

什么时候应该而且不应该在python中预先分配列表列表? 例如,我有一个带有2个列表的函数,并从中创建列表列表。 很像,但不完全是矩阵乘法。我应该预先分配结果吗,

X = Len(M)
Y = Len(F)
B = [[None for y in range(Y)] for x in range(X)]
for x in range(X):
    for y in range(Y):
        B[x][y] = foo(M[x], F[y])
return B

或者在我去的时候动态创建它?

B = []
for m in M:
    B.append([])
    for f in F:
        B[-1].append(foo(m, f))
return B

预分配似乎是不必要的,也许更慢,但动态地看起来是混淆的。特别是B[-1].append(...)似乎难以辨认。

1 个答案:

答案 0 :(得分:15)

只需使用列表理解创建列表:

[[foo(m, f) for f in F] for m in M]

与预分配有关:Pre-allocating a list of None