Производительность списка (…) .insert (…)

@Rally25s:

string val;
GetParameterValue("parameterName", out val);

Это неясно из Вашего сообщения (в ответах), что проблема, с которой был. Если объявлено как:

void GetParameterValue<T>(string parameterName, out T val)  { }

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

T GetParameterValue<T>(string parameterName, T ununsed)  { }

Это назвали бы как это:

MyObj.SomeProp = GetParameterValue("parameterName", MyObj.SomeProp);

, который является скорее kludgey, но не худшая представленная методика.

<час>

А различный метод, который я использовал в C++, но еще не попробовал в C#, должен иметь GetParameterValue () некоторый объект Вас собственный дизайн, и затем реализовать много неявных операторов броска для него.

class ParameterHelper
{
   private object value;
   public ParameterHelper(object value)   { this.value = value;  }

   public static implicit operator int(ParameterHelper v)
     { return (int) v.value; }

}
ParameterHelper GetParameterValue( string parameterName);

MyObj.SomeProp = GetParameterValue("parameterName");
13
задан ilya n. 10 July 2009 в 15:42
поделиться

3 ответа

Python - это язык. Существует несколько реализаций , и они могут иметь разные реализации для списков. Таким образом, не глядя на код реальной реализации, вы не можете точно знать, как реализованы списки и как они ведут себя при определенных обстоятельствах.

Могу поспорить, что ссылки на объекты в списке хранятся в непрерывной памяти (конечно, не как связанный список ...). Если это действительно так, то вставка с использованием x.insert приведет к перемещению всех элементов за вставленным элементом. Это может быть эффективно выполнено с помощью оборудования, но сложность все равно будет O (n) .

Для небольших списков операция пополам может занять больше времени, чем x .insert , даже если первый равен O (log n) , а второй - O (n) . Однако для длинных списков я рискну предположить, что узким местом является x.insert . В таких случаях вы должны рассмотреть возможность использования другой структуры данных.

Если это действительно так, то вставка с использованием x.insert приведет к перемещению всех элементов за вставленным элементом. Это может быть эффективно выполнено с помощью оборудования, но сложность все равно будет O (n) .

Для небольших списков операция пополам может занять больше времени, чем x .insert , даже если первый равен O (log n) , а второй - O (n) . Однако для длинных списков я рискну предположить, что узким местом является x.insert . В таких случаях вы должны рассмотреть возможность использования другой структуры данных.

Если это действительно так, то вставка с использованием x.insert приведет к перемещению всех элементов за вставленным элементом. Это может быть эффективно сделано с помощью оборудования, но сложность все равно будет O (n) .

Для небольших списков операция пополам может занять больше времени, чем x .insert , даже если первый равен O (log n) , а второй - O (n) . Однако для длинных списков я рискну предположить, что узким местом является x.insert . В таких случаях следует рассмотреть возможность использования другой структуры данных.

Для небольших списков операция bisect может занять больше времени, чем x.insert , даже если первое равно O (log n) , а второе - O (n) . Однако для длинных списков я рискну предположить, что узким местом является x.insert . В таких случаях следует рассмотреть возможность использования другой структуры данных.

Для небольших списков операция bisect может занять больше времени, чем x.insert , даже если первое равно O (log n) , а второе - O (n) . Однако для длинных списков я рискну предположить, что узким местом является x.insert . В таких случаях вы должны рассмотреть возможность использования другой структуры данных.

14
ответ дан 1 December 2019 в 20:11
поделиться

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

11
ответ дан 1 December 2019 в 20:11
поделиться

Списки CPython представляют собой непрерывные массивы. Какая из вставок O (log n) bisect и O (n) доминирует в вашем профиле производительности, зависит от размера вашего списка, а также от постоянных факторов внутри O (). В частности, функция сравнения, вызываемая bisect, может быть довольно затратной в зависимости от типа объектов в списке.

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

6
ответ дан 1 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

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