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

che*_*eak 8 python obfuscation allocation list

什么时候应该而且不应该在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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ash*_*ary 15

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

[[foo(m, f) for f in F] for m in M]
Run Code Online (Sandbox Code Playgroud)

与预分配相关:预分配列表None

  • 我喜欢这个解决方案,但它并没有真正回答这个问题"在python中预先分配列表有什么优势吗?".显然在这种情况下,列表理解是最好的方法并且可以避免这个问题,但是在某些情况下这不是真的,在这些情况下,原始问题很有趣. (11认同)
  • @SethMMorton我之前已经回答过:[预先分配无列表](http://stackoverflow.com/questions/22225666/pre-allocating-a-list-of-none) (3认同)
  • 读此文章时,我的鼻子因手掌发痛。 (2认同)