Это действительно зависит от списка. Для нормального, лениво оцененного списка Int
s на моем компьютере я вижу, что эта функция работает примерно через 2 секунды для 10^9 элементов, 0,2 секунды для 10^8 и 0,3 секунды для 10^7, поэтому она, похоже, работает в линейное время. Вы можете проверить это самостоятельно, передав флаги +RTS -s -RTS
вашему исполняемому файлу при его запуске из командной строки.
Я также попытался запустить его с большим количеством ядер, но он, похоже, ничего не делает, но немного увеличивает использование памяти.
Добавленный бонус ленивых вычислений состоит в том, что вы делаете только один проход над списком. filter
и length
превращаются в один цикл компилятором (при включенной оптимизации), поэтому вы сохраняете память и эффективность.
Если вы действительно параноик, вы всегда можете сделать эквивалент один цикл: 'count needle haystack = foldl '(\ acc elem -> if elem == игла, затем acc + 1 else acc) 0 haystack'. – kqr
Вы не можете считать n элементов быстрее, чем O (n), поэтому я не уверен, что вы беспокоитесь. – augustss
@augustss - мое беспокойство было, если я делал двойной проход над списком. –