Эффективные структуры данных в Maple

Я работаю с большим объемом данных в Maple, и мне нужно знать наиболее эффективный способ их хранения. Я начал со списков, но быстро понял, насколько они неэффективны, поэтому заменил их. Теперь я использую смесь массивов (для структур с фиксированной длиной) и таблиц (для структур с переменной длиной), но мой код на самом деле работает значительно медленнее, чем когда я использовал только списки.

Итак, вот мои вопросы:

  • Какова наиболее эффективная структура данных для использования в Maple для набора данных статической длины? для набора переменной длины?
  • Есть ли какие-либо «подводные камни», о которых мне нужно знать при использовании этих структур в качестве параметров в рекурсивном процессе? При использовании массивов или таблиц нужно ли копировать каждый из них для каждой итерации, чтобы избежать затирания данных?

person SonOfHans    schedule 21.07.2015    source источник
comment
что вы имеете в виду под эффективностью? добавить данные или выбрать?   -  person nafas    schedule 21.07.2015
comment
У меня есть некоторые структуры данных, которые мне нужно только инициализировать, а затем ссылаться позже с модификацией или без нее (в настоящее время я использую для них массивы), и другие структуры, в которых мне нужно иметь возможность добавлять, удалять и изменять записи (в настоящее время используется таблицы для них). Потребность в эффективности исходит из того факта, что все эти модификации/дополнения/и т. д. происходят во вложенных циклах for и рекурсивных процессах.   -  person SonOfHans    schedule 21.07.2015
comment
Я рекомендую вам разместить ваши вопросы и ваш код (как версию для списков, так и версию для массивов/таблиц) на www.mapleprimes.com. Списки неэффективны, только если вы добавляете элементы по одному (или несколько) за раз. Массивы можно очень эффективно растягивать (переменной длины). Я не думаю, что их можно уменьшить. Наиболее важный фактор при ответе на ваш вопрос, вероятно, заключается в том, нужно ли вам добавлять данные в структуру по одному фрагменту за раз.   -  person Carl Love    schedule 21.07.2015
comment
Какие данные хранятся в этих структурах? Данные с плавающей запятой, которые подходят для двойной точности, часто хорошо хранятся (и доступны) в массивах/матрицах/векторах, созданных с опцией datatype=float[8]. Кроме того, вы пишете, что у вас большой объем данных, но неясно, подразумеваете ли вы много маленьких структур или несколько больших структур. Очень маленькие списки могут вести себя лучше, чем очень маленькие массивы. Команды, которые используют семантику на месте, задокументированы как таковые и часто делают это только тогда, когда это требует необязательный аргумент. Более подробная информация о коде поможет дать более конкретные советы.   -  person acer    schedule 21.07.2015
comment
Большое спасибо за ваши ответы. Я понимаю, насколько проще было бы посмотреть на код, но я не могу опубликовать его из соображений конфиденциальности. Я дам как можно больше подробностей. Данные добавляются по одному во все структуры, которые должны быть гибкими, поэтому кажется, что списки действительно неэффективны. Кроме того, моя установка подпадает под категорию нескольких больших структур, где структуры могут стать настолько большими, что Maple выдает ошибку ограничения размера, когда я использую списки (Ошибка, присваивание длинному списку, пожалуйста, используйте массивы). Что касается типа переменной, то все данные в больших структурах являются целыми.   -  person SonOfHans    schedule 21.07.2015
comment
Возможно, вы сможете немного сэкономить память, используя самый узкий целочисленный тип данных, который может хранить ваши данные. Например, datatype=integer[4] или datatype=integer[1] и т. д. Это значение индекса, умноженное на 8 бит, означает целое число[4]=32 бита. (Так что integer[1] подходит только для значений 0 или 1 и т. д.) Теперь остается вопрос, почему код теперь работает медленнее, чем при использовании только списков. Возможно, код или команды, которые он вызывает, в какой-то момент преобразует часть данных в списки на лету? Вы часто коллируете indices() или entries() за столами?   -  person acer    schedule 21.07.2015
comment
И извините, если это не относится: если у вас есть массивы с более чем одним измерением, всегда обращайтесь к ним, как к A[i,j], а не к A[i][j], поскольку последний создает A[i] как временный структура мусора при каждом таком вызове.   -  person acer    schedule 21.07.2015
comment
На самом деле, у меня есть многомерные массивы, на которые я ссылаюсь с помощью A[i][j], и я понятия не имел, что они ведут себя таким образом. Я обязательно изменю их на A[i,j] и, конечно же, могу попробовать установить тип данных для своих массивов. У меня нет вызовов indices() или entries(), но я использую EqualEntries(); это вызовет какие-либо проблемы? Спасибо!   -  person SonOfHans    schedule 22.07.2015


Ответы (1)


Думаю, теперь я могу закончить это. Я сделал несколько улучшений производительности, в основном небольшие изменения, которые лишь немного помогли, но мне удалось добиться значительного улучшения, удалив как можно больше экземпляров команды копирования (я использовал ее для массивов и таблиц). Оказывается, это то, что приводило к тому, что моя реализация массива/таблицы была медленнее, чем моя реализация только для списка. Но код по-прежнему работал не так быстро, как мне нужно, поэтому я переписал его на C#. Вероятно, это не лучшее решение для вопроса «как повысить эффективность Maple», но теперь оно работает намного быстрее.

person SonOfHans    schedule 28.07.2015