Why am I getting only about 3k to 300k hashes per second?
You are limited by your machine clock speed and hashing library performance. 
Scripting langs are not a good choice for CPU intensive operations. 

Also, you are doing hashes sequentially, try multiprocessing: https://docs.python.org/2/library/multiprocessing.html