Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

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

Đang mở
#160,556 0 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@serhiy-storchaka đang làm issue này rồi.

Từ ngày 26/10/2026.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
35/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
performance

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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
Ngôn ngữ chính
Python
Star
77.7k
Fork
38.3k
Merge trung bình
13 giờ 43 phút
Pull request đã merge (30 ngày)
704

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của python/cpython

Tất cả issue của python/cpython

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.