Avoid unnecessary NotShareableError creation in XIData FULL_FALLBACK
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 35.9k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Proposal:
Motivation
The pickle fallback path in _PyObject_GetXIData() does unnecessary work on successful transfers of types that are not in the XIData registry, creating and discarding a NotShareableError that user code never sees.
This is a follow-up to gh-148072 / GH-148125, which cached pickle.dumps and pickle.loads per interpreter. That change removed module lookup overhead, but there is still avoidable cost in the fallback path itself.
This extra exception work adds measurable overhead to cross-interpreter transfers that rely on pickle fallback.
Approach
Check the XIData registry first with lookup_getdata() before calling _get_xidata().
- If the type is registered, keep using the existing path unchanged.
- If the type is not registered, skip
_get_xidata()and go directly to the function/pickle fallback chain.
On total failure, raise the same NotShareableError as the existing code path, so external behavior stays the same.
Benchmark results
This removes unnecessary exception creation on a hot fallback path and gives a measurable speedup for transfers that rely on pickle fallback.
In local benchmarks on Apple M2, combined with GH-148125, this improved round-trip transfer times for mutable objects such as list and dict, especially for larger payloads.
Large-payload benchmark results (500 iterations, Apple M2)
Baseline is upstream/main after GH-148125 (pickle cache). "After" includes this change.
| Data | Before | After | Speedup |
|---|---|---|---|
list [1 x 100KB] |
1.19ms | 0.12ms | 9.9x |
list [1 x 1MB] |
10.26ms | 0.20ms | 51x |
list [10 x 100KB] |
9.99ms | 0.10ms | 100x |
dict {10 x 100KB} |
10.41ms | 0.26ms | 40x |
Related
- gh-148072 — Predecessor: pickle module caching (merged as GH-148125)
- gh-124694 — InterpreterPoolExecutor addition
Validation
Local testing passed:
./python -m test test_interpreters./python -m test test_concurrent_futures
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
Linked PRs
- gh-148224
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với _PyObject_GetXIData() và lần theo lookup_getdata() cùng _get_xidata() trong đường dẫn fallback của pickle. Xem xét PR được liên kết gh-148224, sau đó chạy ./python -m test test_interpreters và ./python -m test test_concurrent_futures; được xem là hoàn tất khi vẫn giữ nguyên hành vi hiện có của NotShareableError đồng thời tránh tạo ngoại lệ không cần thiết.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- backend, performance
- Loại issue
- Tái cấu trúc
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 25/100