Вы получаете эту причину ошибки, выполнив minsum, maxsum = 0
. Вы должны использовать последовательность (список, кортеж, dict или диапазон, например). Python итерирует его, а затем приписывает соответствующие значения переменным. Конечно, левая и правая сторона должны иметь одинаковое количество элементов. Если есть только один, это должна быть последовательность.
Как сказали вам комментарии, вы можете сделать minsum, maxsum = 0, 0
.
Range (), конечно, не задействован.
В дополнение к этому, вы можете сделать это:
for value in arr[:4]:
minsum += value
for value in arr[1:]:
maxsum += value
Это лучше, чем использование диапазона и индекса. И я предлагаю вам следовать рекомендации PEP8 для имени функции (mini_max_sum
вместо miniMaxSum
: имена функций и переменных PEP8
) Имена функций должны быть строчными, со словами разделены подчеркиваниями, необходимыми для улучшения читабельности.
Имена переменных следуют тому же соглашению, что и имена функций.
mixedCase допускается только в тех контекстах, где это уже является преобладающим стилем (например, threading.py), чтобы сохранить обратную совместимость.
blockquote>
У меня есть он работающий через 0,34 секунды по сравнению с 9 + минуты
Проблема при сравнении структур KeyValuePair. Я работал вокруг этого путем записи объекта компаратора и передачи экземпляра его к Словарю.
Из того, что я могу определить, KeyValuePair. GetHashCode () возвращает хэш-код, он Key
объект (в этом примере наименее уникальный объект).
Как словарь добавляет (и проверяет существование), каждый объект, это использует и Равняется и функции GetHashCode, но должно полагаться, Равняется функции, когда хэш-код менее уникален.
Путем обеспечения более уникальной функции GetHashCode это excerises Равняется функции намного менее часто. Я также оптимизировал, Равняется функции для сравнения более уникальных Значений прежде меньше unqiue Ключей.
86,000 * 11 объектов с 10 000 выполнений уникальных свойств за 0,34 секунды с помощью объекта компаратора ниже (без компаратора возражают, 9 минутам требуются 22 секунды),
Надежда это помогает :)
class StringPairComparer
: IEqualityComparer<KeyValuePair<string, string>>
{
public bool Equals(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
{
return x.Value == y.Value && x.Key == y.Key;
}
public int GetHashCode(KeyValuePair<string, string> obj)
{
return (obj.Key + obj.Value).GetHashCode();
}
}
Править: Если бы это была всего одна строка (вместо KeyValuePair, где строка = Name+Value), то это было бы приблизительно вдвое более быстро. Это - хорошая интересная проблема, и я потратил faaaaaar слишком много времени на него (я учился тихий немного хотя),
если Вам не нужна никакая определенная корреляция между каждой парой ключ/значение и уникальными значениями, Вы генерируете, Вы могли просто использовать GUID? Я предполагаю, что проблема состоит в том, что Ваш текущий 'Ключ' не уникален в этом зубчатом массиве.
Dictionary<System.Guid, KeyValuePair<string, string>> myDict
= new Dictionary<Guid, KeyValuePair<string, string>>();
foreach of your key values in their current format
myDict.Add(System.Guid.NewGuid(), new KeyValuePair<string, string>(yourKey, yourvalue))
Кажется, что это сохранило бы то, в чем Вы нуждаетесь, но я не знаю, как Вы задержали бы данные из этого, поскольку не будет никаких семантических отношений между генерировать Гуидом и что Вы первоначально имели...
Можно ли больше обеспечивать информацию в вопросе?
Как насчет:
Dictionary<NameValuePair,int> hs = new Dictionary<NameValuePair,int>();
foreach (i in jaggedArray)
{
foreach (j in i)
{
if (!hs.ContainsKey(j))
{
hs.Add(j, 0);
}
}
}
IEnumerable<NameValuePair> unique = hs.Keys;
конечно, если Вы использовали C# 3.0.NET 3.5:
var hs = new HashSet<NameValuePair>();
hs.UnionWith(jaggedArray.SelectMany(item => item));
добился бы цели.
Вместо того, чтобы использовать a Dictionary
почему бы не расширяться KeyedCollection<TKey, TItem>
? Согласно документации:
Обеспечивает абстрактный базовый класс для набора, ключи которого встраиваются в значения.
Затем необходимо переопределить protected TKey GetKeyForItem(TItem item)
функция. Поскольку это - гибрид между IList<T>
и IDictionary<TKey, TValue>
Я думаю, что это, вероятно, будет довольно быстро.
Используйте KeyValuePair в качестве класса обертки и затем создайте словарь с создать набор, возможно? Или реализуйте свою собственную обертку, которая переопределяет Равняние и GetHashCode.
Dictionary<KeyValuePair, bool> mySet;
for(int i = 0; i < keys.length; ++i)
{
KeyValuePair kvp = new KeyValuePair(keys[i], values[i]);
mySet[kvp] = true;
}
Вы представили свой код? Вы уверены, что циклы foreach являются узким местом и не ретривером. GetVehicles ()?
Я действительно создавал маленький тестовый проект, где я фальсифицирую ретривера и позволяю ему возвратиться 86.000 X 11 значений. Моя первая попытка достигла в 5 секунд, создав включенные данные.
Я использовал то же значение для обоих ключ и значение, где первый ключ был "0#0" и последним "85999#10".
Затем я переключился на гуиды. Тот же результат.
Затем я сделал ключ дольше, как это:
var s = Guid.NewGuid().ToString();
return s + s + s + s + s + s + s+ s + s + s;
Теперь потребовалось почти 10 секунд.
Затем я делал ключи безумно долго и добирался из исключения памяти. У меня нет файла подкачки на моем компьютере, таким образом, я сразу получил это исключение.
Какой длины Ваши ключи? Действительно ли Ваше потребление виртуальной памяти является причиной Вашей низкой производительности?