Arhn - архитектура программирования

Использование памяти для понимания массива Джулии

Я использую понимание массива для определения интересующего значения для элементов массива самоопределяемого типа.

sum([value.interest for value in ArrayofMyType if condition])

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

Это приводит к накладным расходам каждый раз, когда цикл выполняется, и я не знаю, как сделать это более эффективным и лучше использовать память. Есть ли способ, которым кто-нибудь может помочь мне с этим? Понимания стилистически удобны, но, думаю, не самые эффективные в моем случае.

стиль кода таков:

for i in 1:MAX_ITER
    ### Some code above
    sum([value.interest for value in ArrayofMyType if condition])     
    ### Some code below
end

Ответы:


1

Вы можете использовать выражение генератора (просто опустите скобки):

sum(value.interest for value in ArrayofMyType if condition) 

Это создает не промежуточный массив, а экземпляр типа Generator. Ты можешь сделать

g = (value.interest for value in ArrayofMyType if condition)

для создания такого объекта вне вызова функции. Он реализует интерфейс итератора, в частности, методы start, next, done и некоторые дополнительные методы, такие как length, и поэтому может использоваться везде, где разрешен итератор.

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

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

immutable A{T} x::T end

const a = [A(i) for i in 1:100]

mysum(a) = mysum(eltype(a), a)

function mysum{T}(::Type{A{T}}, a)
    sum = zero(T)
    @inbounds for i in eachindex(a)
        sum += a[i].x
    end
    return sum
end

using BenchmarkTools

@benchmark sum(e.x for e in $a)
@benchmark mysum($a)

Это дает 50ns против 15ns на моем ПК.

20.02.2017
  • какой механизм стоит за этим? Он создает массив? 20.02.2017
  • Нет, он создает экземпляр типа Generator. Вы можете сделать g = (value.interest for value in ArrayofMyType if condition), чтобы получить объект. Он реализует интерфейс итератора, например, функции start, next и done. 20.02.2017
  • @tim: возможно, вы захотите добавить эту информацию к своему ответу! 21.02.2017
  • Я реструктурировал ответ и добавил информацию из комментария выше. 21.02.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..