Проверка мемоизации в Юлии - PullRequest
3 голосов
/ 08 мая 2020

Есть пакет Memoize.jl , с помощью которого можно запоминать в Юлии. Его макрос @memoize создает словарь. Есть ли способ проверить этот словарь?

Например, после выполнения

@memoize f(n) = n ≤ 1 ? n : f(n-1) + f(n-1)

@show f(10)

я хотел бы проверить сгенерированные промежуточные значения f, поэтому f (0), f (1), ..., f (10).

Кто-то написал Memo.jl как замену или расширение Memoize.jl возможность настройки и осмотра. Однако этот пакет, похоже, не поддерживается.

1 Ответ

2 голосов
/ 08 мая 2020

Одна из приятных особенностей Джулии состоит в том, что подобные пакеты представляют собой просто больше кода Джулии, вместо того, чтобы делать что-то в C, что невозможно ткнуть с основного языка. А код для Memoize довольно прост. Взгляните на эту строку :

 fcachename = Symbol("##", f, "_memoized_cache")

Это сообщает вам имя словаря кеша, заданного f как имя функции, которая запоминается. Итак, давайте попробуем получить доступ к переменной с этим именем после запуска вашего примера кода:

julia> var"##f_memoized_cache"
IdDict{Any,Any} with 10 entries:
  (7,)  => 64
  (6,)  => 32
  (4,)  => 8
  (5,)  => 16
  (9,)  => 256
  (10,) => 512
  (2,)  => 2
  (8,)  => 128
  (1,)  => 1
  (3,)  => 4

Voila! Вот собственно кеш. Это просто IdDict со странным именем в том же модуле, что и определение метода. Синтаксис var"..." - это недавно добавленный синтаксис настраиваемого строкового литерала для идентификатора со «странным» именем - это сокращение для выполнения eval(Symbol("##f_memoized_cache")).

Конечно, поскольку это не официально задокументировано часть Memoize API, вы не можете рассчитывать на то, что он не изменится, но в настоящее время он работает. Я не уверен, что вам нужен более официальный API, но если вы захотите, вы можете открыть вопрос с просьбой об этом как о новой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...