이것은 실제 답변보다 추가 분석에 가깝지만 정렬되는 데이터에 따라 달라지는 것 같습니다. 먼저, 기본 독서 :
$ 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
자, 파이썬이 훨씬 빠릅니다. 그러나 sort
숫자로 정렬하도록 지시 하여 coreutils를 더 빠르게 만들 수 있습니다 .
$ 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
매개 변수를 조정하여 더 빠르게 만들 수는 있지만). 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
파이썬은 여전히 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 분류 방법을 지정하면 동일한 속도를 확인하기 위해 조정 list.sort()
을 테스트하려고 시도하는 것보다 더 많은 파이썬 퓨를 가진 사람이 있습니다.