Installation
pip install cn-sort
Requires Python 3.6+. Dependencies (pypinyin, jieba) are installed automatically.
Quick start
from cn_sort import sort_text_list, Mode
# Sort by Pinyin (default)
sort_text_list(['唯依', '唯衣', '唯一', '啊'])
# → ['啊', '唯一', '唯衣', '唯依']
# Sort by stroke order
sort_text_list(['三', '二', '一', '一二'], mode=Mode.BIHUA)
# → ['一', '一二', '二', '三']
# Polyphonic characters handled by context
sort_text_list(['重要', '重庆'])
# → ['重庆', '重要'] (chóng < zhòng)
# Mixed Chinese / Latin
sort_text_list(['中国', 'abc', '啊'])
# → ['abc', '啊', '中国']
# Million-scale: multiprocess kicks in automatically
sort_text_list(big_list, threshold=100_000)
Features
- Two modes —
Mode.PINYIN(pinyin + stroke tiebreaker) orMode.BIHUA(stroke order only) - Polyphonic characters —
pypinyinuses surrounding context to pick the correct reading - Scales to 1M+ words — auto-switches to a multiprocess producer-consumer pipeline above
threshold - Mixed content — Latin / numeric / punctuation sorts before CJK by default
- Zero config — no extra data downloads; priority table ships inside the package
API
sort_text_list(text_list, *, freeze=False, threshold=100_000, mode=Mode.PINYIN) → list[str]
| Parameter | Type | Default | Description |
|---|---|---|---|
text_list |
list[str] |
required | Words to sort |
mode |
Mode |
Mode.PINYIN |
Sorting mode |
threshold |
int |
100_000 |
Switch to multiprocess above this count |
freeze |
bool |
False |
Set True when calling outside if __name__ == '__main__' on Windows |
Mode
| Value | Behaviour |
|---|---|
Mode.PINYIN |
Sort by Pinyin reading; stroke order breaks ties |
Mode.BIHUA |
Sort by stroke count only |
set_stdout_level(level: str) → bool
Set console log verbosity. level ∈ {"DEBUG", "INFO", "WARN", "ERROR", "CRITICAL"}.
How it works
cn_sort converts each word into a tuple of integer priorities, then applies LSD radix sort — sorting from the last character column to the first using Python's stable timsort.
- Priority table — 20 000+ characters pre-ranked by Pinyin + stroke order, stored in
all_word.jsonfor O(1) lookup. - Word → tuple — each character maps to a signature (e.g.
人_ren2) looked up in the table. - LSD radix sort —
operator.itemgettersorts each column in place; stable sort guarantees correct ordering. - Polyphonic chars —
pypinyinselects the right reading from word context automatically.
For lists larger than threshold, cn_sort spawns a producer-consumer process pool:
- N producer processes (CPU count − 1): segment with jieba, deduplicate, push to independent queues.
- 1 consumer process: collects tokens from all queues, builds a priority-tuple cache.
- Main process: reassembles segments, applies final radix sort.
Performance
| Scale | Mode | Time |
|---|---|---|
| < 1 000 words | single-process | < 5 ms |
| 10 000 words | single-process | ~180 ms |
| 1 000 000 words | multiprocess | ~20 s (4-core) |
The jieba segmentation step dominates large-scale runs. Replacing it with a faster segmenter is the highest-leverage future optimisation.
Contributing
git clone https://github.com/bmxbmx3/cn_sort.git
cd cn_sort
pip install pypinyin jieba
- Fork the repo and create a branch:
git checkout -b feat/your-feature - Make changes; add tests where applicable.
- Open a Pull Request.
Good first contributions: Traditional Chinese support, a pytest test suite, faster large-scale segmentation.
License
MIT © bmxbmx3
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cn_sort-0.12.0.tar.gz.
File metadata
- Download URL: cn_sort-0.12.0.tar.gz
- Upload date:
- Size: 472.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b488147a5289a6ba363cf4e935ba69b81519e86ca8772171658f7d5b9ec4996
|
|
| MD5 |
4f7301c7a91e65c11ecc26769164c899
|
|
| BLAKE2b-256 |
67a367a29a96a483f41f5ea00bf63bc8a1bf310592f79f71d0e5f4223a26da79
|
File details
Details for the file cn_sort-0.12.0-py3-none-any.whl.
File metadata
- Download URL: cn_sort-0.12.0-py3-none-any.whl
- Upload date:
- Size: 495.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cd0c59abf42372879976a6679f3d165f90f3942e1630df60f74d98f022cdbd4
|
|
| MD5 |
80d4785728252500de2d98dddf2ec7b7
|
|
| BLAKE2b-256 |
94558939a3923b0fdf9167971f91cd526819345bb070189af8431c2d2bf66c45
|