Why are you calculating the Jacobian symbolically? AFAIK, for complex cases, the numerical Jacobian is often faster / more numerically stable.
Anyway,if your day job needs something like this you're better off using a lisp than python.
Finite differences does indeed have stability issues, and even if you apply some tricks will only give you about half float precision