Библиотеки Memoization для C?
Для проекта, над которым я работаю, есть ряд состояний, в которых можно полагаться на расчеты, чтобы получить одинаковые результаты (и не иметь побочных эффектов). Очевидное решение состоит в том, чтобы использовать памятку для всех дорогостоящих функций.
Мне нужно иметь памятку, которая обрабатывает более одного состояния (чтобы я мог сделать недействительным один набор кешей, не аннулировав другой). Кто-нибудь знает хорошую библиотеку C для такого рода вещей? (Обратите внимание, что это не может быть C++, мы говорим о C.)
Я работал с некоторыми хорошими реализациями в Python, которые используют декораторы, чтобы иметь возможность гибко запоминать кучу различных функций. Мне интересно, есть ли универсальная библиотека, которая могла бы делать подобные вещи с C (хотя, вероятно, с явным переносом функций, а не с удобным синтаксисом). Я просто думаю, что было бы глупо добавлять кеширование к каждой функции по отдельности, когда это достаточно распространенная проблема, для которой должны быть готовые решения.
Характеристики, которые я бы искал, следующие:
- Может кэшировать функции с различными типами ввода и вывода
- Управляет несколькими различными кешами (так что вы можете иметь краткосрочное и долгосрочное кеширование)
- Имеет хорошие функции для аннулирования кэшей
- Предназначен для использования при переносе функций вместо изменения существующих функций
Кто-нибудь знает реализацию C, которая может обрабатывать все или большинство из этих реквизитов?
3 ответа
Итак, поскольку не было никаких библиотек памятки для C, и я искал решение для вставки в память существующих функций C в базе кода, я сделал свою собственную маленькую библиотеку мемоизации, которую я выпускаю под APL 2.0. Надеюсь, что люди найдут это полезным, и он не сработает и не сгорит на других компиляторах Если у него есть проблемы, напишите мне здесь, и я буду изучать его всякий раз, когда у меня будет время (которое, вероятно, будет измеряться с шагом в месяцы).
Эта библиотека не создана для скорости, но она работает и была протестирована, чтобы убедиться, что она довольно проста в использовании и не показывает никаких утечек памяти в моем тестировании. По сути, это позволяет мне добавить памятку к функциям, похожим на шаблон декоратора, к которому я привык в Python.
В настоящее время библиотека находится на SourceForge как библиотека C-Memo. Он поставляется с небольшим руководством пользователя и парой сторонних лицензированных библиотек для общего хеширования. Если местоположение изменится, я постараюсь обновить эту ссылку. Я нашел это полезным в работе над моим проектом, надеюсь, другие найдут его полезным для своих проектов.
Запоминание почти встроено в язык хаскеля. Вы можете вызвать эту функциональность с
Обновить:
Я все еще изучаю функциональное программирование, но я знаю, что запоминание довольно часто встречается в функциональном программировании, потому что языковые возможности облегчают его. Я учусь е #. Я не знаю haskell, но это единственный из известных мне функциональных языков, который будет взаимодействовать с c. Возможно, вам удастся найти другой функциональный язык программирования, который взаимодействует с c более подходящим способом, чем тот, который предоставляет haskell.
Почему просто не может быть C++?
Просто для начала посмотрите на эту функцию запоминания:
объявление:
template<typename T, typename F>
auto Memoize(T key, F function) {
static T memory_key = key;
static auto memory = function(memory_key);
if (memory_key != key) {
memory_key = key;
memory = function(memory_key);
}
return memory;
}
Пример использования:
auto index = Memoize(value, IndexByLetter);