We present a new method to detect planetary transits from time-series photometry, the Transit Least Squares (TLS) algorithm. While the commonly used Box Least Squares (BLS, Kovács et al. 2002) algorithm searches for rectangular signals in stellar light curves, TLS searches for transit-like features with stellar limb-darkening and including the effects of planetary ingress and egress. Moreover, TLS analyses the entire, unbinned data of the phase-folded light curve. These improvements yield a ~10 % higher detection efficiency (and similar false alarm rates) compared to BLS. The higher detection efficiency of our freely available Python implementation comes at the cost of higher computational load, which we partly compensate by applying an optimized period sampling and transit duration sampling, constrained to the physically plausible range. A typical Kepler K2 light curve, worth of 90 d of observations at a cadence of 30 min, can be searched with TLS in about half a second on a standard laptop computer (after a one-time JIT compilation of a few seconds) — as fast as BLS.
-
Fast: a two-year PLATO light curve at 25 s cadence (2.5 million points) is searched with simultaneous GP detrending in 81 s on a single CPU core, 13 s on 16 cores, or about 2 s on a consumer GPU (RTX 5060), including the hyperparameter fit and flare clipping. On the same data, biweight detrending followed by TLS 2.0 takes 37 s on one core (4 s on 16 cores) and BLS 13 min; CETRA needs 12 min on the same GPU,
umbra1.9 h, TLS 1.32 about 3.5 d, andnuanceyears.
Run time per light curve against the number of data points, for a synthetic PLATO light curve from one month to two years at 25 s cadence, on one core of an AMD Ryzen 9 7950X and on an NVIDIA RTX 5060. Open markers and dashed lines are extrapolations; stars are published CETRA timings on other GPUs.
-
Simultaneous GP detrending:
from transitleastsquares import gp; results = gp.search(t, flux, flux_err)models the star with a Gaussian process and integrates it out inside the search, instead of detrending first: every trial transit is fitted jointly with the stellar variability. It needs no detrending window and works on raw, normalised light curves. Tutorials: 📑13 TLS with a GP baseline and 📑14 Reproducing the Talens et al. (2026) PLATO benchmark; documentation: GP search. -
GPU support:
gp.search(..., device="gpu")on an NVIDIA GPU (pip install "transitleastsquares[gpu]"), about 2 s per light curve even for two years of PLATO data. 📑13 TLS with a GP baseline runs the same search on the CPU and the GPU. -
Opt-in analytic SDE background detrending:
power(SDE_detrend="hybrid")(see the Python interface).
TLS can be installed conveniently using: pip install transitleastsquares
If you have multiple versions of Python and pip on your machine, try: pip3 install transitleastsquares
The latest version can be pulled from github:
git clone https://github.com/hippke/tls.git
cd tls
pip install .
For an editable (development) install, use pip install -e . instead of the last line.
For the GPU (NVIDIA, CUDA 13, driver 580 or later): pip install "transitleastsquares[gpu]", or pip install ".[gpu]" in the cloned directory. For older drivers, install numba-cuda[cu12] instead.
Dependencies: Python 3.9+ (tested up to 3.14), NumPy (>= 1.22), numba, tqdm, optional: astroquery (for LD and stellar density priors from Kepler K1, K2, and TESS), batman-package (only needed to run the test suite).
If you have trouble installing, please open an issue.
Here is a terminal recording of a real TLS 2.0 search: 231,000 trial periods on 8 CPU cores in about 6 seconds (3 years of simulated photometry of a solar-type star with an Earth-like planet). For more examples, have a look at the tutorials and the documentation. Two guided tours go from a raw light curve to a planet's posterior. The classical one, the 📑Grand Tour with wotan, downloads a TESS light curve with lightkurve, detrends it with wotan, searches with TLS and fits with pizzetti. The new one, the 📑Grand Tour with simultaneous GP, needs no detrending: a young, strongly variable K2 star is searched with TLS 2.0 + GP and the planet fitted with pizzetti and a Gaussian process.
Please cite Hippke & Heller (2019, A&A 623, A39) if you find this code useful in your research. The BibTeX entry for the paper is:
@ARTICLE{2019A&A...623A..39H,
author = {{Hippke}, Michael and {Heller}, Ren{\'e}},
title = "{Optimized transit detection algorithm to search for periodic transits of small planets}",
journal = {\aap},
year = "2019",
month = "Mar",
volume = {623},
eid = {A39},
pages = {A39},
doi = {10.1051/0004-6361/201834672},
archivePrefix = {arXiv},
eprint = {1901.02015},
primaryClass = {astro-ph.EP},
adsurl = {https://ui.adsabs.harvard.edu/\#abs/2019A&A...623A..39H},
adsnote = {Provided by the SAO/NASA Astrophysics Data System}
}
All my repositories embrace collaboration between humans and AI. Contributions are welcome, whether they are written by you, by an AI assistant, or by both together, and they will be handled promptly. Please open an issue or a pull request.
Copyright 2019-2026 Michael Hippke & René Heller.


