conda solves a problem pip can't: installing non-Python binaries. When you conda install pytorch, you get a pre-compiled PyTorch binary matched to your OS, CPU architecture, and CUDA version — no compilation, no Xcode toolchain, no fighting with C extensions. That single feature is why conda dominates data science, machine learning, and scientific computing.
conda is a cross-language, cross-platform package manager and environment manager. It manages Python packages, sure, but also R packages, C/C++ libraries (OpenSSL, BLAS, MKL), CUDA toolkits, compilers, and entire scientific stacks. Conda environments isolate not just Python deps but the whole binary stack underneath them. That's why a conda create with TensorFlow and CUDA gives you a working GPU environment in one command, where the equivalent pip-based setup might require manual CUDA driver installs.
The trade-off: conda is slower than pip for pure-Python packages (the SAT solver is heavy), and it's much slower than uv. Conda also has its own ecosystem split — packages live on channels (defaults, conda-forge, bioconda, etc.) and not every PyPI package is in a channel. The mix-conda-and-pip workflow is real but error-prone.
Use conda when: you're doing data science, ML, or scientific computing; you need GPU stacks (PyTorch + CUDA, TensorFlow + cuDNN); you need non-Python binaries; or you've inherited a project that uses conda. Use uv or pip when: you're doing web/API/CLI Python; your deps are all pure-Python; you want speed.