Оператор логического OR (||
) - это оператор, который возвращает свой первый или второй операнд в зависимости от того, является ли первое правдоподобным. «Правное» значение означает все, кроме 0
, undefined
, null
, ""
или false
.
Этот оператор использует короткое замыкание, что означает, что если первое выражение правда, тогда второе выражение не оценивается, и первый операнд немедленно возвращается. Это похоже на логический оператор И (&&
) , который делает обратное: если первый операнд ложен, он возвращает его, в противном случае он возвращает второе выражение.
Я устанавливаю структуру каталогов следующим образом:
for i in $(seq 1 4500); do
if [[ $i -lt 100 ]]; then
dir="$(for j in $(seq 1 $i); do echo -n $i/;done)"
mkdir -p "$dir"
touch ${dir}$i
else
touch $i
fi
done
Это создает 99 файлов с путями глубиной 1-99 и 4401 файлом в корне структуры каталогов.
Я использовал следующий скрипт ruby:
#!/usr/bin/env ruby
require 'benchmark'
def recursive(path, bench)
bench.report(path) do
Dir["#{path}/**/**"]
end
end
path = 'files'
Benchmark.bm {|bench| recursive(path, bench)}
Я получил следующий результат:
user system total real
files/ 0.030000 0.090000 0.120000 ( 0.108562)
Я использую следующий скрипт на python, используя os.walk:
#!/usr/bin/env python
import os
import timeit
def path_recurse(path):
for (path, dirs, files) in os.walk(path):
for folder in dirs:
yield '{}/{}'.format(path, folder)
for filename in files:
yield '{}/{}'.format(path, filename)
if __name__ == '__main__':
path = 'files'
print(timeit.timeit('[i for i in path_recurse("'+path+'")]', setup="from __main__ import path_recurse", number=1))
Я получил следующий результат:
0.250478029251
Итак, похоже, что рубин все еще работает лучше. Было бы интересно посмотреть, как это работает с вашим набором файлов на сетевом ресурсе.
Вероятно, было бы также интересно увидеть, как этот скрипт запускается на python3 и с jython и, возможно, даже с pypy.