Есть ли такой генератор / итератор в python для ключей карты в matlab для экономии памяти? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть большая карта в Matlab, и я хочу пройтись по всем ее ключам.Но я могу сначала сохранить ячейку для ключей и пройти через ячейку, которая требует памяти для хранения всех ключей.Находясь в python, генератор / итератор может последовательно возвращать индексы или записи списка обратно в циклы, что не требует больших затрат памяти.

В matlab , я пробовал цикл for:

% Let MAP is a containers.Map with 10000000 keys.
keys = MAP.keys;
for keyIdx = 1:size(keys,2)
    MAP(keys{1,keyIdx});
end

В то время как в python , цикл for с итератором:

% Let MAP is a dictionary with 10000000 keys.
for key in MAP.iterkeys():
    MAP[key]

Итак, есть ли генератор / итератор, подобный тому, который есть в python в matlab длясохранить память при обработке карт?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

MATLAB использует ленивый механизм копирования или копирования при записи.Это означает, что когда вы делаете

B = A;

, оба A и B указывают на одну и ту же память до тех пор, пока вы не попытаетесь изменить один из массивов, и в этот момент MATLAB скопирует данные таким образом, чтобы изменить один из них.не влияет на другую копию.

Это также означает, что, если Containers.Map объект map,

keys = map.keys

не будет копировать ключи, вместо этого будет keysобмениваться данными с ключами, поскольку они хранятся внутри карты.


Обратите внимание, что

keys = map.keys;
for keyIdx = 1:numel(keys)
   value = map(keys{keyIdx})
end

совпадает с

for key = map.keys
   value = map(key{1})
end

и так же, как

for value = map.values
   value = value{1}
end

Ни в одном из этих случаев данные не копируются!

(Я догадываюсь о синтаксисе, поскольку я сейчас набираю текст на своем телефоне, я думаю, что индексирование {1}здесь требуется, но я могу ошибаться.)

0 голосов
/ 23 декабря 2018

Чтобы ответить на ваш главный вопрос: Нет. В MATLAB нет генератора.Кроме того, код Python, который вы написали, не использует генератор Python.Объем памяти в обоих фрагментах одинаков.Но я думаю, что я не получил подробности о вашем вопросе ....

Последнее:

  • вы можете использовать numel(keys) вместо size(keys, 2), поскольку keys имеетодно измерение
  • вы можете использовать MAP(keys{keyIdx}) вместо MAP(keys{1, keyIdx})
...