Size: a a a

Язык программирования Julia / Julia programming language

2020 May 25

A

Alexandr in Язык программирования Julia / Julia programming language
Андрей Оськин
Хм.
Ну, без того, чтобы смотреть внутрь сложно догадаться, что там может происходить.

Но вот я тут такой пример собрал
z = (x -> x, x -> x^2, x -> x^3, x -> x^4, x -> x^5, x -> x^6, x -> x^7, x -> x^8, x -> x^9, x -> x^10)
sizeof(z) # 0
z2 = ntuple(i -> (x -> x^i), 10)
sizeof(z2) # 80
Очень забавная штука на самом деле
источник

A

Alexandr in Язык программирования Julia / Julia programming language
z = (x -> x, x -> x^2, x -> x^3, x -> x^4, x -> x^5, x -> x^6, x -> x^7, x -> x^8, x -> x^9, x -> x^10)
sizeof(z) # 0
z2 = ntuple(i -> (x -> x^i), 10)
sizeof(z2) # 80


Вот такой маленький эксперимент:
julia> f1 = (i) -> x -> x^2
#101 (generic function with 1 method)

julia> f1(1)
#102 (generic function with 1 method)

julia> typeof(f1(1))
var"#102#104"

julia> sizeof(f1(1))
0


Но
julia> f2 = (i) -> x -> x^i
#105 (generic function with 1 method)

julia> typeof(f2(1))
var"#106#108"{Int64}

julia> sizeof(f2(1))
8

julia> sizeof(f2(Int8(1)))
1
источник

A

Alexandr in Язык программирования Julia / Julia programming language
julia> @code_lowered(f2(10))
CodeInfo(
1 ─ %1 = Main.:(var"#106#108")
│   %2 = Core.typeof(i)
│   %3 = Core.apply_type(%1, %2)
│        #106 = %new(%3, i)
└──      return #106
)
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Т.е. Джулия созадет для лямбды из f2 функциональный объект, в котором хранит аргументы для  вызова функции
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Отсюда и sizeof(z2) == 80, т.е. 10*sizeof(Int64) в оригинальном примере
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Отличный разбор! Спасибо.
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
а можно ли сделать так, чтобы генератор возвращал массив, но при этом не аллоцировал память
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
например, я хочу пройтись по всем массивам, у которых координаты меняются от 0 до 1
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
у меня есть генератор, в котором есть поле curr — массив, который заполняется in-place на каждой итерации
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
но если я хочу реализовать протокол итерации, то мне нужна функция iterate(...), возвращающая текущее значение и следующее
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
и если я пишу return (gen.curr, next)
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
у меня будут аллокации на то, что я возвращаю gen.curr
источник

VG

Viktor G. in Язык программирования Julia / Julia programming language
наверное нужно хранить память о предыдущем
gen.curr, gen.prev
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
непонятно, как вернуть пару (A,B), где A — массив, и избежать аллокаций
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
На самом деле если вдуматься, то Джулия всё правильно делает.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Если у тебя мутабельный массив и ты возвращаешь на него указатель (или ссылку, или что там под капотом), то получается, что тот кто будет им пользоваться внутри итератора может его изменить (случайно или намеренно) и тем самым изменить работу итератора.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Хотя правда если он возращает тупл от того же массива, то наверное я не прав 😊
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Да, не прав.
Интересно зачем она тогда память аллоцирует.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Тогда можно предложить заменить итераторы на do стиль. То есть предоставить функцию, вида process(f, yourstructure), которая внутри будет применять функцию f к каждому сгенерированному массиву.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Немного коряво (хотя чутка напоминает трансдьюсеры), но работать будет и без аллокаций.
источник