Производительность вложенного урожая в дереве

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

find . -type f -print |
perl -l -ne '
    

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
} = -M; # store file age (mtime - now) END { $,="\n"; print sort {

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{$b} <=>

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{$a}} keys %_; # print by decreasing age }'

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'

7
задан Bakuriu 24 April 2014 в 08:16
поделиться

5 ответов

Это определенно не идеально с точки зрения производительности - вы в конечном итоге создаете множество итераторов для больших деревьев вместо одного итератора, который знает, как эффективно обходить.

Некоторые записи в блогах, касающиеся это:

Стоит отметить что F # имеет эквивалент предложенного « yield foreach » с « yield! »

10
ответ дан 6 December 2019 в 05:49
поделиться

Вы можете повысить производительность, если развернете рекурсию в стек, поэтому у вас будет только один итератор:

public IEnumerable<Foo> GetAll()
{
    Stack<Foo> FooStack = new Stack<Foo>();
    FooStack.Push(this);

    while (FooStack.Count > 0)
    {
        Foo Result = FooStack.Pop();
        yield return Result;
        foreach (Foo NextFoo in Result.MyChildren)
            FooStack.Push(NextFoo);
    }
}
20
ответ дан 6 December 2019 в 05:49
поделиться

Согласно моему предыдущему опыту, использование yield намного эффективнее, чем создание списка. Если вы используете .NET 3.5, эта реализация должна подойти. Но не забывайте

yield break;

в конце. : -)

-1
ответ дан 6 December 2019 в 05:49
поделиться

Нет, выглядит нормально.

Взгляните на мою запись в блоге , она может быть полезна :)

1
ответ дан 6 December 2019 в 05:49
поделиться

A better solution might be to create a visit method that recursively traverses the tree, and use that to collect items up.

Something like this (assuming a binary tree):

public class Node<T>
{
    public void Visit(Action<T> action)
    {
        action(this);
        left.Visit(action);
        right.Visit(action);
    }

    public IEnumerable<Foo> GetAll ()
    {
        var result = new List<T>();
        Visit( n => result.Add(n));
        return result;
    }
}

Taking this approach

  • Avoids creating large numbers of nested iterators
  • Avoids creating any more lists than necessary
  • Is relatively efficient
  • Falls down if you only need part of the list regularly
2
ответ дан 6 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: