Python

為什麼 coreutils 排序比 Python 慢?

  • November 24, 2014

我編寫了以下腳本來測試 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 和sort8.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 語言中,所以那裡有一個公平的競爭環境。Coreutilssort 顯然使用了歸併排序算法。Mergesort 進行固定數量的比較,這些比較與輸入大小成對數增加,即大 O (n log n)。

Python 的排序使用獨特的混合合併/插入排序timsort,它將與 O(n) 的最佳情況場景進行可變數量的比較——大概是在已經排序的列表上——但通常是對數的(邏輯上,你對於排序時的一般情況,不能比對數更好)。

給定兩種不同的對數排序,在某些特定數據集上,一種可能比另一種具有優勢。傳統的歸併排序不會發生變化,因此無論數據如何,它都會執行相同的操作,但是例如,確實會發生變化的快速排序(也是對數)在某些數據上會表現更好,但在其他數據上表現會更差。

三個因子(或大於 3,因為sort是並行化的)雖然相當多,這讓我想知道這裡是否沒有一些意外情況,例如sort交換到磁碟(該-T選項似乎暗示它確實如此)。但是,您的低系統與使用者時間意味著這不是問題。

引用自:https://unix.stackexchange.com/questions/169739