In my view, Python is a good choice for building the machine learning part (you don't say anything about the rest of your application, so I can't comment of that).

[NumPy][1] is powerful and mature, and has lots of numerical packages built on top of it.

For example, [SciKits][2] is a suite of such packages. It incorporates [`scikit-learn`][3], which is

> a Python module integrating classic machine learning algorithms in the tightly-knit scientific Python world (numpy, scipy, matplotlib). It aims to provide simple and efficient solutions to learning problems, accessible to everybody and reusable in various contexts: machine-learning as a versatile tool for science and engineering

With regards to performance, native NumPy operations are on par with their [BLAS][4] counterparts (they basically are wrappers around BLAS). Thus, NumPy code that can be expressed in terms of vector/matrix operations tends to be as fast as comparable C/Fortran code.

On the flip side, code expressed as Python loops can be slow. Additionally, it is [hard to speed things up][5] by using multiple threads. However, there are ways around both of these shortcomings: using [`multiprocessing`][6] instead of threading, [`numexpr`][7], [Cython][8] and so on.


  [1]: https://numpy.org/
  [2]: https://web.archive.org/web/20130804130142/http://projects.scipy.org:80/scikits
  [3]: https://scikit-learn.org/stable/
  [4]: https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
  [5]: https://en.wikipedia.org/wiki/Global_Interpreter_Lock
  [6]: https://docs.python.org/3/library/multiprocessing.html
  [7]: https://github.com/pydata/numexpr/
  [8]: https://cython.org/