Python 3 is very fine for exploring asymmetric cryptography: it is clean, concise, powerful; has built-in support for arbitrarily large integers; is easy to install, learn and use; it minimizes the idea-to-result delay; and it has enough industrial traction that knowing it has marketplace value.
Since Python 3.6, there's the built-in
secrets module intended to generate cryptographically strong random numbers (and it was feasible to build or add similar functionality in previous versions). It will make "generating random private keys.. in a range" a breeze.
While the built-in integers are fast enough for most uses, should you need more speed, there's gmpy2, with precompiled Windows binaries there.
Just be conscious that:
- It is hard to prevent side channel leakage (e.g. by timing variation) in Python, which can be an issue for cryptographic code that both can be observed (perhaps, remotely) by adversaries, and manipulates secrets like private keys.
- The size and frequent updates of the Python runtime and packages adds to the configuration audit and hardening nightmare of safely deploying crypto in the real world.
- Python is not good for code that must be callable from other languages or run in small microcontrollers.