นี่เป็นการวิเคราะห์พิเศษมากกว่าคำตอบจริง แต่ดูเหมือนจะแตกต่างกันไปขึ้นอยู่กับข้อมูลที่เรียงลำดับ ก่อนอ่านฐาน:
$ printf "%s\n" {1..1000000} > numbers.txt
$ time python sort.py <numbers.txt >s1.txt
real 0m0.521s
user 0m0.216s
sys 0m0.100s
$ time sort <numbers.txt >s2.txt
real 0m3.708s
user 0m4.908s
sys 0m0.156s
ตกลงหลามเป็นมากได้เร็วขึ้น อย่างไรก็ตามคุณสามารถทำให้ coreutils sort
เร็วขึ้นโดยบอกให้เรียงลำดับตัวเลข:
$ time sort <numbers.txt >s2.txt
real 0m3.743s
user 0m4.964s
sys 0m0.148s
$ time sort -n <numbers.txt >s2.txt
real 0m0.733s
user 0m0.836s
sys 0m0.100s
นั่นเป็นมากเร็วขึ้น แต่ยังคงหลามชนะโดยอัตรากำไรกว้าง ตอนนี้ลองอีกครั้ง แต่ด้วยรายการที่ไม่มีการเรียงลำดับของตัวเลข 1M:
$ sort -R numbers.txt > randomized.txt
$ time sort -n <randomized.txt >s2.txt
real 0m1.493s
user 0m1.920s
sys 0m0.116s
$ time python sort.py <randomized.txt >s1.txt
real 0m2.652s
user 0m1.988s
sys 0m0.064s
coreutils sort -n
เร็วกว่าสำหรับข้อมูลตัวเลขที่ไม่เรียงลำดับ (แม้ว่าคุณอาจสามารถปรับแต่งcmp
พารามิเตอร์ของ python sort เพื่อทำให้เร็วขึ้น) Coreutils sort
ยังคงช้าลงอย่างมีนัยสำคัญโดยไม่มี-n
ธง แล้วตัวละครแบบสุ่มไม่ใช่เลขบริสุทธิ์ล่ะ?
$ tr -dc 'A-Za-z0-9' </dev/urandom | head -c1000000 |
sed 's/./&\n/g' > random.txt
$ time sort <random.txt >s2.txt
real 0m2.487s
user 0m3.480s
sys 0m0.128s
$ time python sort.py <random.txt >s2.txt
real 0m1.314s
user 0m0.744s
sys 0m0.068s
Python ยังคงเต้น coreutils แต่มีขนาดเล็กกว่าสิ่งที่คุณแสดงในคำถามของคุณ น่าแปลกที่มันยังเร็วขึ้นเมื่อดูข้อมูลตัวอักษรบริสุทธิ์:
$ tr -dc 'A-Za-z' </dev/urandom | head -c1000000 |
sed 's/./&\n/g' > letters.txt
$ time sort <letters.txt >s2.txt
real 0m2.561s
user 0m3.684s
sys 0m0.100s
$ time python sort.py <letters.txt >s1.txt
real 0m1.297s
user 0m0.744s
sys 0m0.064s
เป็นสิ่งสำคัญที่จะต้องทราบว่าทั้งสองไม่ได้ผลิตผลลัพธ์เรียงเดียวกัน:
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B
$ echo -e "A\nB\na\nb\n-" | python sort.py
-
A
B
a
b
ผิดปกติพอ--buffer-size
ตัวเลือกไม่ได้สร้างความแตกต่างมาก (หรือใด ๆ ) ในการทดสอบของฉัน สรุปได้ว่าน่าจะเพราะขั้นตอนวิธีการที่แตกต่างกันดังกล่าวในคำตอบของ goldilock หลามsort
ดูเหมือนว่าจะได้เร็วขึ้นในกรณีส่วนใหญ่ แต่ตัวเลข GNU sort
เต้นบนตัวเลขไม่ได้เรียงลำดับ1
OP อาจพบสาเหตุที่แท้จริงแต่เพื่อความสมบูรณ์นี่เป็นการเปรียบเทียบขั้นสุดท้าย:
$ time LC_ALL=C sort <letters.txt >s2.txt
real 0m0.280s
user 0m0.512s
sys 0m0.084s
$ time LC_ALL=C python sort.py <letters.txt >s2.txt
real 0m0.493s
user 0m0.448s
sys 0m0.044s
1 คนที่มี python-fu ยิ่งกว่าที่ฉันควรลองทดสอบการปรับแต่งlist.sort()
เพื่อดูความเร็วเดียวกันสามารถทำได้โดยการระบุวิธีการเรียงลำดับ