Reduce some code sizes
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ả
In a release build without PGO or LTO, Python's .text segment is over 5 MB.
$ size ./python
text data bss dec hex filename
5726491 829744 468280 7024515 6b2f83 ./python
Much of this size is necessary, but some code can be reduced significantly with only small changes to code generation. Reducing the amount of code may improve the efficiency of CPU resources such as the instruction cache and branch prediction structures.
The following are the results of having Codex investigate the top 25 functions.
Largest functions in CPython
Top 25 functions in the rebuilt ./python on main, before merging the bytes and 1-byte Unicode decimal-output paths.
Sizes are function symbol sizes in bytes, obtained with readelf --symbols --wide ./python and sorted in descending order. They include inlined code but exclude separately stored data tables and out-of-line callees. The comments summarize the main reasons for the code size, based on the source and inline debug information.
| Rank | Function | Bytes | Why it is large |
|---|---|---|---|
| 1 | _PyEval_EvalFrameDefault |
61,487 | Main bytecode interpreter: many instructions and specialized variants, with inlined stack and reference-count operations. |
| 2 | add_ast_annotations |
49,036 | Generated code repeats type construction, dictionary insertion, cleanup, and error handling for every AST field. |
| 3 | obj2ast_stmt |
31,029 | Converts Python AST objects into internal statement nodes, with separate field validation and conversion for each statement type. |
| 4 | long_to_decimal_string_internal |
24,989 | Decimal digit output is duplicated for bytes and 1-, 2-, and 4-byte Unicode representations, with substantial SIMD expansion. |
| 5 | obj2ast_expr |
20,585 | The expression counterpart: many expression types, each with its own attribute checks and conversion logic. |
| 6 | type_ready |
20,027 | Many type-initialization helpers are inlined, especially the extensive slot-inheritance logic in inherit_slots. |
| 7 | sre_ucs2_match |
17,008 | Complete regex matching engine for 2-byte characters, including repetition, backtracking, and inlined character-set checks. |
| 8 | sre_ucs4_match |
16,341 | A separately compiled copy of the regex matching engine for 4-byte characters. |
| 9 | sre_ucs1_match |
16,288 | A separately compiled copy of the regex matching engine for 1-byte characters. |
| 10 | _PyConfig_Read |
15,804 | Command-line parsing, environment processing, encoding configuration, and other initialization helpers are extensively inlined. |
| 11 | ast2obj_stmt.part.0 |
15,590 | Builds Python AST objects from internal statements, with repeated attribute assignments and inlined list conversions. |
| 12 | _PyAST_Fini |
13,914 | Generated Py_CLEAR operations individually expand reference-count checks and cleanup for many AST state fields. |
| 13 | errno_exec |
13,753 | Registers many errno constants individually; the _add_errcode helper is inlined at repeated call sites. |
| 14 | _PyUnicode_ToNumeric |
13,106 | A generated switch maps a large, sparse set of Unicode code points to numeric values. |
| 15 | init_types |
12,346 | Generated initialization for all AST classes and operator singletons, plus inlined identifier initialization. |
| 16 | split |
12,249 | Inlines whitespace and separator splitting for ASCII and 1-, 2-, and 4-byte Unicode representations. |
| 17 | replace |
12,168 | Handles several replacement strategies and character-width conversions, with inlined search and counting routines. |
| 18 | r_object |
12,135 | Main marshal decoder: handles many object types, nested containers, code objects, and shared-reference reconstruction. |
| 19 | PyUnicode_Format |
11,388 | Inlines % format parsing, argument conversion, padding, width, and precision handling. |
| 20 | codegen_visit_expr_impl |
11,387 | Compiles many expression types, with inlined helpers for calls, method-call optimization, subscripts, and string construction. |
| 21 | _PyUnicode_InitGlobalObjects |
11,154 | Contains generated static-string interning calls and inlined initialization of the global table and interpreter intern dictionary. |
| 22 | simple_stmt_rule |
9,764 | Generated parser alternatives inline several statement rules, particularly imports, plus lookahead, backtracking, and syntax-error handling. |
| 23 | codegen_visit_stmt |
9,732 | Dispatches statement compilation and inlines helpers for imports, assignments, returns, and pattern matching. |
| 24 | compound_stmt_rule |
9,705 | Inlines substantial parsing logic for with, match, try, and for, including invalid-syntax rules. |
| 25 | _PyLexer_get_normal |
9,681 | Combines token recognition, indentation handling, and identifier validation with inlined character-reading and buffer-refill logic. |
Linked PRs
- gh-157393
- gh-157483
- gh-157531
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 bằng việc xem xét các PR được liên kết đã liệt kê (gh-157393, gh-157483 và gh-157531) cùng các hàm hàng đầu được báo cáo từ ./python đã được build lại. Sử dụng readelf --symbols --wide và size để xác định các hàm nào chiếm phần lớn release build. Được xem là hoàn tất khi giảm được segment .text mà không dùng PGO hoặc LTO, đồng thời giữ nguyên hành vi hiện có.
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
- performance
- Loại issue
- Tái cấu trúc
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- 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