Этот ответ дополняет многие великие существующие ответы следующими способами:
- POSIX-совместимая функция на основе
awk
, sort
и cut
, адаптированная из собственного ответа OP :
shuf() { awk 'BEGIN {srand(); OFMT="%.17f"} {print rand(), $0}' "$@" |
sort -k1,1n | cut -d ' ' -f2-; }
shuf() { perl -MList::Util=shuffle -e 'print shuffle(<>);' "$@"; }
shuf() { python -c '
import sys, random, fileinput; from signal import signal, SIGPIPE, SIG_DFL;
signal(SIGPIPE, SIG_DFL); lines=[line for line in fileinput.input()];
random.shuffle(lines); sys.stdout.write("".join(lines))
' "$@"; }
shuf() { ruby -e 'Signal.trap("SIGPIPE", "SYSTEM_DEFAULT");
puts ARGF.readlines.shuffle' "$@"; }
Сравнение производительности:
Примечание. Эти цифры были получены на iMac, выпущенном в конце 2012 года, с процессором Intel Core i5 с тактовой частотой 3,2 ГГц и диском Fusion, работающим под управлением OSX 10.10.3. Хотя время будет зависеть от используемой ОС, спецификации машины, awk
используемая реализация (например, версия BSD awk
, используемая в OSX, обычно медленнее, чем GNU awk
и особенно mawk
), это должно дать общее представление о относительной производительности .
Входной файл представляет собой файл 1 миллион строк , созданный с seq -f 'line %.0f' 1000000
.
Время указано в порядке возрастания (сначала самое быстрое):
shuf
- Рубин 2.0.0
- Perl 5.18.2
- Python
1.342s
с Python 2.7.6; 2.407s
(!) С Python 3.4.2
awk
+ sort
+ cut
3.003s
с BSD awk
; 2.388s
с GNU awk
(4.1.1); 1.811s
с mawk
(1.3.4);
Для дальнейшего сравнения решения, не упакованные как функции выше:
sort -R
(не является случайным образом, если есть повторяющиеся строки ввода)
10.661s
- выделение большего объема памяти, кажется, не имеет значения
- Скала
bash
петли + sort
Выводы
- Используйте
shuf
, если можете - это самый быстрый на сегодняшний день.
- Ruby преуспевает, затем Perl .
- Python заметно медленнее, чем Ruby и Perl, и, сравнивая версии Python, 2.7.6 немного быстрее, чем 3.4.1
- Используйте POSIX-совместимый
awk
+ sort
+ cut
в качестве последнего средства ; какая awk
реализация, которую вы используете, имеет значение (mawk
быстрее, чем GNU awk
, BSD awk
медленнее).
- Держитесь подальше от
sort -R
, bash
петель и Scala.