PERF: branchless calendar algorithms for datetime conversions#31126
PERF: branchless calendar algorithms for datetime conversions#31126jbrockmendel wants to merge 3 commits intonumpy:mainfrom
Conversation
Replace `get_datetimestruct_days` (ymd→days) with Hinnant's loop-free public-domain algorithm and `set_datetimestruct_days` (days→ymd) with Neri-Schneider's branchless Euclidean Affine Function algorithm. Simplify `days_to_month_number` to delegate to the new `set_datetimestruct_days` instead of duplicating the days→year→month logic. Mirrors pandas PR #64662. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Can we have a little more context why we want this? Speed, correctness, something else? |
|
The benefit is performance. I see a 5% speedup in ns->D conversion, 18% in ns->M. |
|
close/reopen |
|
Can we get some concrete benchmarks demonstrating the speedup? Can you also verify that our test coverage for these conversions is good? I'm a little nervous about completely changing the implementation of a poorly tested codepath. If you know of an expert we can ping to review this, that might also help assuage concerns about correctness. |
Test the Neri-Schneider fast-path boundaries, the fallback path for extreme dates just outside that range, and typical dates including leap year boundaries (1900, 2000). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
claude says "The existing 470 tests already cover pre-1970 dates, leap year boundaries, year 0/negatives, Y2038, and int64 limits"
That's similar to the comment in pandas asking me to open this PR. The hope is that by keeping the implementations aligned we can benefit from each others' coverage. FWIW my understanding is that the same algorithm is used in c++20's chrono implementation. We just can't use it directly because they don't support int64 years. |
|
I added a triage review label to make sure we talk about this at next week's triage meeting. Feel free to come, see the calendar.
Oh nice, it might also help if you add a link to an implementation of this as a comment. Someone could also try comparing the two implementations. |
|
Yeah, I think it probably makes sense to just follow pandas, it seems like the sources are trustworthy, although reviewing that it is identical code isn't all that easy (bots help a bit with confidence, I guess). |
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Claude wrote this, i reviewed manually. As with my other PRs, my C-fu is weak.
This is explicitly modeled on pandas-dev/pandas#64662.
cc @seberg