这比实际答案更像是一种额外的分析,但它似乎根据要排序的数据而有所不同。首先,基础阅读:
$ 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
好的,python 要快得多。但是,可以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
这是多快,但仍然蟒通过大幅胜出。现在,让我们再试一次,但要列出100万个数字的未排序列表:
$ 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
sort -n
对于未排序的数字数据,coreutils 速度更快(尽管您可以调整python sort的cmp
参数以使其更快)。sort
没有该-n
标志,Coreutils 仍然明显较慢。那么,随机字符而不是纯数字呢?
$ 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
在大多数情况下python 似乎更快,但数值 GNU sort
在未排序的数字上胜过python 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()
的人,可以通过指定排序方法来实现相同的速度。