To preallocate or not to preallocate lists in Python

13,255

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

Share:
13,255
cheezsteak
Author by

cheezsteak

Updated on June 04, 2022

Comments

  • cheezsteak
    cheezsteak almost 2 years

    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.

  • SethMMorton
    SethMMorton about 10 years
    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.
  • Ashwini Chaudhary
    Ashwini Chaudhary about 10 years
    @SethMMorton I've already answered that before: Pre-allocating a list of None