python / python/cpython

Improve performance by using reference stealing methods

Đang mở
#150,942 19 bình luận 8 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

easy extension-modules performance type-feature
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ả

Feature or enhancement

Proposal:

We can improve performance of cpython by using stealing methods (_PyList_AppendTakeRef, _PyDict_SetItem_Take2, PyTuple_FromPairSteal etc.) instead of the normal ones. Using stealing methods we typically avoid an incref/decref pair and sometimes error handling is simplified. We should only make changes where it makes a performance impact, the code is not more complex and the modules or methods affected are performance critical.

A list of possible cases (there might be more).

Location Module / context Helper
Modules/_csv.c:688 csv reader, per field _PyList_AppendTakeRef
Modules/pyexpat.c:472 pyexpat StartElement, per attribute _PyDict_SetItem_Take2
Modules/_elementtree.c:3351 ElementTree C accel attrib dict _PyDict_SetItem_Take2
Modules/_io/bytesio.c:577 io.BytesIO.readlines _PyList_AppendTakeRef
Modules/_io/iobase.c:756 io.IOBase.readlines (generic) _PyList_AppendTakeRef
Objects/frameobject.c:639 & 658 frame f_locals / vars() / tracing _PyList_AppendTakeRef
Modules/_pickle.c:5138 pickle Pickler memo copy _PyDict_SetItem_Take2
Modules/_io/textio.c:2337 & 2343 io.TextIOWrapper readline (multi-chunk) _PyList_AppendTakeRef
Modules/_asynciomodule.c:1213 asyncio future done-callback compaction _PyList_AppendTakeRef

Update: Most cases already have an open PR, for new ones please open a separate issue.

Linked PRs
  • gh-150943
  • gh-150945
  • gh-150995
  • gh-151002
  • gh-151062
  • gh-151209
  • gh-151608
  • gh-153013
  • gh-154860
  • gh-155171
  • gh-155304
  • gh-155922
  • gh-155940
  • gh-155957
  • gh-156055
  • gh-156199

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

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.

Hướng nghiên cứu

Xem xét các vị trí C được liệt kê, bao gồm Modules/_csv.c, Modules/pyexpat.c, Modules/_elementtree.c và các tệp trong _io, Objects, _pickle và _asynciomodule. Trước tiên, hãy kiểm tra các PR được liên kết để xem những trường hợp nào đã được bao phủ; mọi công việc còn lại nên được tách thành một issue riêng, có phạm vi rõ ràng, cùng các bài kiểm tra hiệu năng liên quan. Hoàn thành có nghĩa là một trường hợp được chọn, quan trọng về hiệu năng đã được thay đổi mà không làm tăng độ phức tạp, đồng thời hành vi và hiệu năng của trường hợp đó đã được xác minh.

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

Đánh giá

Công nghệ
c, python
Lĩnh vực
backend
Loại issue
Tính năng
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
25/100

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.