Эффективно перебирать структуры в Julia

У меня простой вопрос. Я определил структуру, и мне нужно инициировать много (порядка миллионов) из них и зацикливаться на них.

Я запускаю по одному и прохожу цикл следующим образом:

using Distributions

mutable struct help_me{Z<:Bool}
    can_you_help_me::Z
    millions_of_thanks::Z
end

for i in 1:max_iter
    tmp_help = help_me(rand(Bernoulli(0.5),1)[1],rand(Bernoulli(0.99),1)[1])
    # many follow-up processes 
end

Распределение памяти увеличивается в max_iter. Для моей цели мне не нужно сохранять каждую структуру. Есть ли способ «повторно использовать» выделение памяти, используемое структурой?

Вопрос 1: зачем ты это делаешь Z<:Bool? Bool уже конкретный тип? Вопрос 2: по какой причине help_me должно быть mutable? неизменяемые структуры часто дешевле. также явная передача rng в rand может дать вам легкое двукратное ускорение. (из соображений безопасности многопоточности)

Oscar Smith 22.12.2020 06:33

Привет Оска, спасибо за вопросы. 1. Не знал. Спасибо. 2. На самом деле это может быть не так. Спасибо. Я все еще разрабатываю процессы, через которые должен пройти каждый агент. 3. Не знал. Спасибо. Есть решение проблемы с распределением памяти?

manuka 22.12.2020 06:36

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

Oscar Smith 22.12.2020 06:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
422
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В остальном я согласен с предложениями Оскара Смита: выделение памяти и сборка мусора требуют времени, по возможности избегайте этого из соображений производительности.

Ответ принят как подходящий

Ваша основная проблема заключается в следующем:

rand(Bernoulli(0.5),1)[1], rand(Bernoulli(0.99),1)[1]

Вы создаете массив длины 1, а затем читаете первый элемент из этого массива. Это выделяет ненужную память и требует времени. Не создавайте здесь массив. Вместо этого напишите

rand(Bernoulli(0.5)), rand(Bernoulli(0.99))

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

Сравните тайминги здесь:

julia> using BenchmarkTools

julia> @btime rand(Bernoulli(0.5),1)[1]
  36.290 ns (1 allocation: 96 bytes)
false

julia> @btime rand(Bernoulli(0.5))
  6.708 ns (0 allocations: 0 bytes)
false

В 6 раз быстрее и без выделения памяти.

Кажется, это общая проблема. Очень часто я вижу, как люди пишут rand(1)[1], когда им следовало бы использовать просто rand().

Кроме того, подумайте, действительно ли вам нужно создавать структуру mutable, как упоминали другие.

Спасибо. Очень признателен.

manuka 22.12.2020 19:56

Другие вопросы по теме