Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

csv.Sniffer.sniff() takes quadratic time on long runs of spaces

Aperta
#160,556 0 commenti 0 reazioni 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@serhiy-storchaka ci sta già lavorando.

Dal 26/10/2026.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
performance

Direzione di ricerca

Read Lib/csv.py and inspect the regex search in Sniffer._split_dormant() described in the issue. Reproduce the slowdown with the supplied timing sample, then check that the proposed lookbehind preserves matching results while avoiding repeated attempts within a space run. Done means the long-run timings no longer grow quadratically and the existing csv tests pass.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

stdlib type-bug

Bug report

Bug description:

On main, csv.Sniffer().sniff() takes quadratic time when the sample contains a quote character and a long run of spaces that is not followed by one:

import csv, time

for n in (8000, 16000, 32000, 64000):
    sample = 'a' + ' ' * n + 'x"\n'
    t = time.perf_counter()
    try:
        csv.Sniffer().sniff(sample)
    except csv.Error:
        pass
    print(n, round(time.perf_counter() - t, 4))

Seconds, on macOS 27.0.1 (Apple M3):

n main (debug build) main + fix (debug build) 3.15.0 (release, for comparison)
8000 0.050 0.011 0.010
16000 0.153 0.002 0.004
32000 0.598 0.004 0.007
64000 2.373 0.008 0.015

The sample ('a,b' + ' ' * 100_000 + 'c"\n') * 4 takes 23.2 s on main and 0.06 s with the fix.

The cause is the regex in Sniffer._split_dormant() (Lib/csv.py):

m = re.compile(fr'(?:^|([\r\n{cls}]))'
               fr' *{quotechar}').search(part, pos)

The space is a delimiter candidate whenever the sample contains one, so it is in cls. The search then tries a match at every space of the run: [...] matches that space, * consumes the rest of the run, and the match fails on the next character. A run of n spaces costs O(n**2).

A match that starts at a space preceded by a space is never the leftmost one: a match with the same group and the same end also starts at the beginning of the run. Adding the lookbehind (?<! ) after the group skips those positions without changing any result.

This was introduced in gh-83273 (25fea6d64e1) and is in 3.16.0a1. 3.15 and older are not affected.

CPython versions tested on:

3.15, CPython main branch

Operating systems tested on:

macOS

Linked PRs
  • gh-160557
Lingua principale
Python
Stelle
77.7k
Fork
38.3k
Merge medio
13h 43m
PR unite (30g)
704

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di python/cpython

Tutte le issue di python/cpython

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.