Agreed.
Each Cursor represents/wraps an HSTMT and you can only prepare one statement per HSTMT. Therefore, there really isn't a way to manage multiple prepared statement that is any better than the solution above.
However, the largest pyodbc slowdown for INSERT statements actually comes from the fact that pyodbc has to call SQLDescribeCol for all NULL values. (You must tell ODBC the type of data you are inserting, but there is no type in a dynamic language. There is also no type that can always be inserted into all columns that I could choose. For example, SQL Server will not allow a NULL string to be put into a binary field -- there is no conversion it says.)
Internally, the types of columns are tracked so that multiple inserts with the same statement do not require another SQLDescribeCol call. One long outstanding request is to track the types for the last N statements instead of just the last 1.