Python uses a Global Interpreter Lock, which basically switches processing between threads which basically boils down to sequential multi-threading, no 2 threads will be processed at the same time. Which in principle is fine as technically speaking this is how all threads are processed at a CPU level, however Pythons implementation of this is flawed, so when you get multiple threads and multiple cores the GIL basically has threads competing against each other for the lock as they are on different CPUs which results in dramatic decreases in performance to the point where you might aswell run a single threaded application.
Read this for detailed explanation
[Only registered and activated users can see links. Click Here To Register...]