Shouldn't be that slow. Implementing A* in a scripting language is the first problem. Scripting languages aren't well suited for graph searches, or any other high cost calculations for that matter. If you are embedding into a lower level app like c++ I'd recommend doing tha A* in there, and exposing functions to do searches. If that isn't an option(the whole app in script?), some things you can do are:
1) Use better data structures. Looks like you brute force your search in functions like get_best_open_node. That is usually implemented in a priority queue.
2) Pre-process your map into a lower resolution search space. This will likely be what gives you the best speedup. Merge large areas of pixels into axis aligned or convex shapes. Then you just A* using those areas instead of pixels.
Bottom of this link describes a method that should work well for you:
http://www.gamasutra.com/features/20020405/smith_01.htm
I'm doing something very similar with my bot in 3d.
http://www.omni-bot.de/e107/e107_plu...topic.php?4142
First flooding the level with small nodes, then merging into sectors that will then be used for navigation. This would be much easier in 2d even.
Also if your environment is pretty static you could pre-process a lookup table using floyd-warshall, resulting in about a ~1.3M(or700k if you used shorts, but most scripting languages dont have many options for that) lookup table.
There's many options, but the first thing I'd do is move the search out of script if possible, change your data structures, then if performance still isnt acceptable a hierarchial pre-processing is probably the next easiest step, the point there being to greatly reduce the search space.
Since it sounds like you are bound completely in the scripting language reducing the search space and optimizing your data structures are your main options.