Python
為什麼 coreutils 排序比 Python 慢?
我編寫了以下腳本來測試 Python 排序功能的速度:
from sys import stdin, stdout lines = list(stdin) lines.sort() stdout.writelines(lines)
sort
然後,我將其與包含 1000 萬行的文件上的 coreutils命令進行了比較:$ time python sort.py <numbers.txt >s1.txt real 0m16.707s user 0m16.288s sys 0m0.420s $ time sort <numbers.txt >s2.txt real 0m45.141s user 2m28.304s sys 0m0.380s
內置命令使用了所有四個 CPU(Python 只使用了一個),但執行時間大約是原來的 3 倍!是什麼賦予了?
我正在使用 Ubuntu 12.04.5(32 位)、Python 2.7.3 和
sort
8.13
Izkata 的評論揭示了答案:特定地區的比較。該
sort
命令使用環境指示的語言環境,而 Python 預設使用字節順序比較。比較 UTF-8 字元串比比較字節字元串更難。$ time (LC_ALL=C sort <numbers.txt >s2.txt) real 0m5.485s user 0m14.028s sys 0m0.404s
那個怎麼樣。
這兩種實現都在 C 語言中,所以那裡有一個公平的競爭環境。Coreutils
sort
顯然使用了歸併排序算法。Mergesort 進行固定數量的比較,這些比較與輸入大小成對數增加,即大 O (n log n)。Python 的排序使用獨特的混合合併/插入排序timsort,它將與 O(n) 的最佳情況場景進行可變數量的比較——大概是在已經排序的列表上——但通常是對數的(邏輯上,你對於排序時的一般情況,不能比對數更好)。
給定兩種不同的對數排序,在某些特定數據集上,一種可能比另一種具有優勢。傳統的歸併排序不會發生變化,因此無論數據如何,它都會執行相同的操作,但是例如,確實會發生變化的快速排序(也是對數)在某些數據上會表現更好,但在其他數據上表現會更差。
三個因子(或大於 3,因為
sort
是並行化的)雖然相當多,這讓我想知道這裡是否沒有一些意外情況,例如sort
交換到磁碟(該-T
選項似乎暗示它確實如此)。但是,您的低系統與使用者時間意味著這不是問題。