Size: a a a

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

2020 July 06

VG

Viktor G. in Язык программирования Julia / Julia programming language
Андрей Оськин
Ключи - это просто строки. “title”, “author” и так далее.
А, просто как поля динамической структуры
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Ммммм... нет :-)


d = Dict{String, Any}(“author” => “Vasiliy Pupkin”, “title” => “Hello”, “body” => “Hello world”, “url” => “http://blog.vpupkin.ru”)

d[“title”]
# “Hello”
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
collect(keys(d))
# author
# title
# body
# url
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Artem Korzhimanov
Разница, грубо говоря, такая:
1) массив - быстрый доступ к произвольному аргументу, но медленное добавление элементов в середину
2) список - быстрое добавление элементов в любое место, но медленное обращение к произвольному аргументу
3) кортеж - если массив маленький и используется только локально, то объявив его кортежем можно выиграть в скорости (будет создан на стеке, а не в куче)
4) словарь - быстрое добавление в любое место, быстрый произвольный доступ, но данные не лежат последовательно, векторные операции работают неэффективно
Зависит от типа операции. Если это что-то вроде x->x^2 для каждого значения, то так как эта операция не затрагивает меппинг между ключами и значениями, то она выполняется почти с той же скоростью, что и обычная операция (минус заполненность вектора значений).
источник

AK

Artem Korzhimanov in Язык программирования Julia / Julia programming language
Андрей Оськин
Зависит от типа операции. Если это что-то вроде x->x^2 для каждого значения, то так как эта операция не затрагивает меппинг между ключами и значениями, то она выполняется почти с той же скоростью, что и обычная операция (минус заполненность вектора значений).
если использовать @simd, то почти наверняка нет, да и просто в цикле скорее всего тоже из-за промаха с кешем
источник

АО

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

Могу ошибаться, но что-то похожее применяется в dictionaries.jl, которые вроде как раз и обещают эффективные map операции.
источник

AK

Artem Korzhimanov in Язык программирования Julia / Julia programming language
Это странно и unexpected если так сделано, потому что противоречит обычному паттерну использования словаря: я бы ожидал от Dict быстрого добавления и удаления пар, а с Vector это можно сделать только с большими накладными расходами на память.
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Всем спасибо!
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Ммм, я могу ошибаться, так что ничего не гарантирую :-)

Но насколько я помню, технически словарь в Джулии это просто вектор значений (с дырками, так как хэш не идеальный).
При попытке найти значение ключа вычисляется его хэш, по которому находится положение значения. Плюс есть система проверки на коллизии, если при проверке выясняется, что место уже занято, то хэш считается второй раз и так далее, в зависимости от глубины бакета.
источник

KT

Kirill Tsaregorodtse... in Язык программирования Julia / Julia programming language
hash table
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
А, точнее даже так, вспомнил. Есть два вектора - вектор ключей и вектор значений. Когда вы задаёте ключ, то от него считается хэш и вычисляется место в векторе ключей. Если на этом месте стоит правильный ключ, то поиск останавливается, если нет, то он продолжается. Если нужный ключ найден, то по этому же положению вытаскивается значение.
источник

AK

Artem Korzhimanov in Язык программирования Julia / Julia programming language
да, вы правы, под капотом там действительно два вектора. Я не разбирался, как они конкретно добавляют новую пару и удаляют старые, но подозреваю, что если делать это долго, то эти вектора будут изрешеченными, и последовательно итерировать по ним будет затруднительно.
источник

АО

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

AK

Artem Korzhimanov in Язык программирования Julia / Julia programming language
Да, наверное, я не прав. Действительно, по этим векторам наверняка можно итерировать, как по обычным. И если одновременно ключ и значение не нужны, то это будет не хуже, чем просто вектор
источник

AK

Artem Korzhimanov in Язык программирования Julia / Julia programming language
проблемы начнутся, если надо будет сделать что-то типа x[i] = x[i] - x[i-1]
источник

АО

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

Вообще надо всё-таки посмотреть https://github.com/andyferris/Dictionaries.jl
источник

АО

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

АО

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


http://www.paulgraham.com/avg.html
источник
2020 July 09

RR

Rashid Rafeek in Язык программирования Julia / Julia programming language
источник

RR

Rashid Rafeek in Язык программирования Julia / Julia programming language
Hey all. This is a channel which broadcasts the posts from the Julia subreddit. Thought you might be interested.
источник