Options 2 and 3 require more data transmitted to the server on an update - and thus have a bigger communication overhead for just the data.
Does each row have a different set of updated columns, or is the set of columns updated the same for any given run (but the list might vary from run to run)?
In the latter case (same set of columns updated on a given run), then option 1 is likely to perform better; the statement will be prepared once and used many times with a minimum of data transferred to the server for each update.
In the former case, I would look to see whether there is a relatively small subset of the columns that are changed (say 10 columns that are changed in different rows, even if any one row only changes up to 3 of those 10). In that case, I'd probably parameterize for the 10 columns, accepting the relatively small overhead of transmitting 7-9 column values that have not changed for the convenience of a single prepared statement. If the set of updated columns is all over the map (say more than 50 of the 100 columns are updated over the entire operation), then it is probably simpler just to deal with the whole lot.
To some extent, it depends on how easy your host language (client API) makes it to handle the various possible ways of parameterizing the updates.