[Solved] To preallocate or not to preallocate lists in Python
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.
Solution #1:
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
The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .