13

When should and shouldn't I preallocate a list of lists in python? For example, I have a function that takes 2 lists and creates a lists of lists out of it. Quite like, but not exactly, matrix multiplication. Should I preallocate the result,

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

or dynamically create it as I go?

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

Preallocating seems unnecessary and perhaps slower, but dynamically looks obfuscated. In particular, B[-1].append(...) seems illegible.

cheezsteak
  • 2,731
  • 4
  • 26
  • 41

1 Answers1

18

Simply create the list using list comprehension:

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

Related to pre-allocation: Pre-allocating a list of None

Community
  • 1
  • 1
Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
  • 14
    I like this solution, but it doesn't really answer the question "are there advantages to preallocating lists in python?". Obviously in this case the list comprehension is the best method and circumvents the issue, but there are some cases where this isn't true, and in those cases the original question is intriguing. – SethMMorton Mar 31 '14 at 19:42
  • 4
    @SethMMorton I've already answered that before: [Pre-allocating a list of None](http://stackoverflow.com/questions/22225666/pre-allocating-a-list-of-none) – Ashwini Chaudhary Mar 31 '14 at 19:48