Где разграничить - действительно ли возможно любить LINQ слишком много? [закрытый]

Просто расчешите данные, которые вы хотите сохранить постоянными. Поскольку ваш прецедент не требует очень сложного хранения данных, травление - очень хороший вариант. Небольшой пример:

import pickle

WordList = ["cat", "hat", "jump", "house", "orange", "brick", "horse", "word"]

# do your thing here, like
Wordlist.append("monty");

#open a pickle file
newfile = 'mypickle.pk'

with open(newfile, 'wb') as fi:
  # dump your data into the file
  pickle.dump(Wordlist, fi)

Позже, когда вам нужно снова его использовать, просто загрузите его:

#load your data back to memory when you need it
with open(newfile, 'rb') as fi:
  WordList = pickle.load(fi)

Ta-da! Теперь вы сохраняете данные. Подробнее здесь . Несколько важных указателей:

  1. Обратите внимание на 'b', когда я использую open(), чтобы открыть файл. Мне нравится использовать файлы рассола в качестве двоичных файлов. Это помогает избежать проблем с некоторыми сложными структурами объектов при их рассортировке.
  2. Я использовал команду with. Это гарантирует, что файл будет безопасно закрыт после завершения всей моей работы с файлом. Это помогает предотвратить случайный доступ к соленым огурцам или перезапись.

22
задан BobTheBuilder 9 January 2009 в 04:59
поделиться

12 ответов

Я должен согласиться с Вашим представлением - если более эффективно записать и изящный тогда, каковы несколько миллисекунд. Запись дополнительного кода дает больше места для ошибок для закрадываний, и это - дополнительный код, который должен быть протестирован, и больше всего это - дополнительный код для поддержания. Думайте о парне, который собирается войти позади Вас и поддержать Ваш код - они поблагодарят Вас за запись изящного легкий считать код задолго до того, как они благодарят Вас за запись кода, это - некоторые мс быстрее!

Остерегаются, хотя, эта стоимость некоторых мс мог быть значительным при принятии большего изображения. Если это, немного миллисекунд являются частью цикла тысяч повторений, то миллисекунды складывают быстро.

19
ответ дан BenAlabaster 29 November 2019 в 04:00
поделиться

Да можно ли любить LINQ слишком много - отдельный оператор LINQ RayTracer

, Где Вы разграничиваете? Я сказал бы использование LINQ так, как это делает код более простым и легким для чтения.

момент версия LINQ становится более трудной понять тогда non-LINQ версию, которую пора подкачать, и наоборот.Править: Это главным образом относится к LINQ к объектам, поскольку другие ароматы LINQ обладают своими собственными преимуществами.

9
ответ дан Cameron MacFarland 29 November 2019 в 04:00
поделиться

Не возможный любить Linq к Объектам слишком много, это - чертовски потрясающая технология!

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

8
ответ дан Tim Jarvis 29 November 2019 в 04:00
поделиться

LINQ's, воображаемый, чтобы использоваться для создания фильтрации, сортировки, агрегации и управления данными из различных источников максимально интуитивными и выразительными. Я сказал бы, использовать его везде, где Вы чувствуете, что это - самый опрятный, самый выразительный и самый естественный синтаксис для того, чтобы сделать то, что это, Вы пытаетесь сделать, и сделать не, чувствуют себя виновными об этом.

, Если Вы начинаете горбить документацию, тогда может быть пора пересмотреть Ваше положение.

5
ответ дан Rob 29 November 2019 в 04:00
поделиться

Это - случаи как они, где важно помнить золотые правила оптимизации:

  1. не Делают Этого
  2. Для Экспертов: еще не делайте этого

, Вы должны абсолютно не беспокойство о "злоупотреблении" linq, если Вы не можете indentify это явно как причина проблемы производительности

5
ответ дан lomaxx 29 November 2019 в 04:00
поделиться

Как что-либо, этим можно злоупотребить. Пока Вы избегаете очевидных плохих решений такой как

var v = List.Where(...);
for(int i = 0; i < v.Count(); i++)
{...}

и понимаете, как отличался работы выполнения, тогда это, скорее всего, не собирается быть намного медленнее, чем обычное письмо путь. По словам Anders Hejlsburg (архитектор C#), компилятор C# не особенно хорош в оптимизации циклов, однако это становится намного лучше в оптимизации и параллелизации деревьев выражений. Вовремя, это может быть более эффективно, чем цикл. List<> версия ForEach на самом деле с такой скоростью, как для цикла, хотя я не могу найти ссылку, которая доказывает это.

P.S. Мой любимый является ForEach<> менее известный кузен IndexedForEach (использующий дополнительные методы)

List.IndexedForEach( (p,i) => 
 {
     if(i != 3)
        p.DoSomething(i);
 };
5
ответ дан Steve 29 November 2019 в 04:00
поделиться

LINQ может быть похожим на искусство. Продолжайте использовать его для создания кода красивым.

4
ответ дан Jimmy Bergmark - JTB World 29 November 2019 в 04:00
поделиться

Вы отвечаете на свой собственный вопрос путем разговора о записи в 2-3 раза большего количества кода для некоторых мс производительности. Я имею в виду, если Ваша проблемная область требует что ускорение тогда да, если не, вероятно, нет. Однако он действительно только некоторые мс производительности или он> 5% или> 10%. Это - субъективная оценка на основе отдельного случая.

1
ответ дан BobbyShaftoe 29 November 2019 в 04:00
поделиться

Где разграничить?

ну, мы уже знаем, что это - плохая идея реализовать Ваше собственное quicksort в linq, по крайней мере, по сравнению только с использованием orderby linq.

0
ответ дан Community 29 November 2019 в 04:00
поделиться

Я нашел, что использование, которое имеет LINQ, ускоряет мою разработку и облегчило избегать глупых ошибок, которые могут представить циклы. У меня были экземпляры, где производительность LINQ была плоха, но это было, когда я использовал его для вещей как данные выборки для файла Excel от древовидной структуры, которая имела миллионы узлов.

0
ответ дан Noaki 29 November 2019 в 04:00
поделиться

В то время как я вижу, как существует точка зрения, что LINQ мог бы сделать оператор тяжелее для чтения, я думаю, что он далеко перевешивается тем, что мои методы теперь строго связаны с проблемами, что они решают и не проводят время или включая циклы поиска или создают помехи классам специализированными функциями поиска.

Это взяло некоторое время для привыкания к выполнению вещей с LINQ, так как поиски цикличного выполнения, и т.п., были основной опцией так долго. Я смотрю на LINQ, как просто являющийся другим типом синтаксического сахара, который может сделать ту же задачу более изящным способом. Прямо сейчас я все еще избегаю его в тяжелом обработкой коде в жестком реальном времени - но это только, пока производительность не улучшается, поскольку LINQ развивается.

0
ответ дан Joseph Ferris 29 November 2019 в 04:00
поделиться

Моя единственная озабоченность по поводу LINQ с его реализацией соединений.

, Поскольку я определил при попытке ответить этот вопрос (и он подтвердил здесь ), код, который LINQ генерирует для выполнения соединений, (обязательно, я предполагаю), наивный: для каждого объекта в списке соединение выполняет линейный поиск через список, к которому присоединяются, для нахождения соответствий.

Добавление соединения к запросу LINQ по существу превращает линейно-разовый алгоритм в квадратично-разовый алгоритм. Даже если Вы думаете, что преждевременная оптимизация является корнем всего зла, переход от O (n) к O (n^2) должен дать Вам паузу. (Это - O (n^3), если Вы присоединяетесь через соединенный объект к другому набору, также.)

относительно легко работать вокруг этого. Например, этот запрос:

var list = from pr in parentTable.AsEnumerable()
join cr in childTable.AsEnumerable() on cr.Field<int>("ParentID") equals pr.Field<int>("ID")
where pr.Field<string>("Value") == "foo"
select cr;

походит, как Вы присоединились бы к двум таблицам в SQL Server. Но это ужасно неэффективно в LINQ: для каждой родительской строки, что where возвраты пункта, запрос сканирует всю дочернюю таблицу. (Даже если Вы присоединитесь на неиндексируемом поле, SQL Server создаст хеш-таблицу для ускорения соединения, если это может. Это - ранг оплаты небольшого внешнего LINQ.)

Этот запрос, однако:

string fk = "FK_ChildTable_ParentTable";
var list = from cr in childTable.AsEnumerable()
where cr.GetParentRow(fk).Field<string>("Value") == "foo"
select cr;

приводит к тому же результату, но он сканирует дочернюю таблицу однажды только.

при использовании LINQ для объектов те же проблемы применяются: если Вы хотите присоединиться к двум наборам какого-либо значительного размера, Вы, вероятно, собираетесь должны рассмотреть реализацию более эффективного метода найти объект, к которому присоединяются, например:

Dictionary<Foo, Bar> map = buildMap(foos, bars);
var list = from Foo f in foos
where map[f].baz == "bat"
select f;
0
ответ дан Community 29 November 2019 в 04:00
поделиться