per discussion elsewhere, it's much faster but only if you avoid lists. as @molpopgen summarized:
passing lists to append_columns is a performance killer, too. One solution for ftprime will be to use numpy arrays (with the correct dtypes, which I can write down in the README for my project when I get a moment...) and act like you're in C:
> When appropriate, send the slice `x[:x_size]` to the correct version of `append_columns`.
> When filling, if `x_size` will become `len(x)` after adding data, create a new array that's the concatenation of `x` and a new empty array of size `INITIAL_SIZE`.
per discussion elsewhere, it's much faster but only if you avoid lists. as @molpopgen summarized:
fill X with new data, and x_size += 1 each time