Size: a a a

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

2018 August 30

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
в общем видимо быстрее всего либо самому в цикле проверить, индексируясь по срезу (slice), либо вынести этот цикл в функцию с макросом @inline
источник

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
Ну если какого-то умного reduce не завезли...
источник

DP

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

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
all(y->y==x[1], x) - вот это точно нельзя адаптировать? Я до компа через час доберусь, сам если что проверю, но, кажется, можно
источник

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
Kirill А ты на какой версии тестишь?
источник

KT

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

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
я на работе никак не мигрирую на 1.0, у нас с установкой нового ПО всё очень сложно )
источник

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
function ar_equal1(v, y, startInd, endInd)
   return v[startInd:endInd] == y[startInd:endInd]
end

function ar_equal1v(v, y, startInd, endInd)
   return view(v, startInd:endInd) == view(
y, startInd:endInd)
end


function ar_equal2(v, y, startInd, endInd)
   return all(i->v[i] == y[i], startInd:endInd)
end


function ar_equal3(v, y, startInd, endInd)
   return all(i->v[i] == y[i], startInd:endInd)
end  

@inline function ar_equal4(x, y, startInd, endInd)
   for i=startInd:endInd
       x[i] == y[i] || return false
   end
   return true
end

y =  
collect(1:10_000_000)
v =
collect(1:10_000_000)

@btime ar_equal1(y, v, 2, 9999999)
@btime ar_equal1v(y, v, 2, 9999999)
@btime ar_equal2(y, v, 2, 9999999)
@btime ar_equal3(y, v, 2, 9999999)
@btime ar_equal4(y, v, 2, 9999999)

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

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
Dmitry Penzar
По идее они все создают массив булевых значений, ибо невозможно догадаться, что ты с этим чудом делать будешь
это верно только для всяких all(), для обычного сравнения должно быть понятно, видимо они и поняли.
источник

AL

Anatoly Levenchuk in Язык программирования Julia / Julia programming language
Вот тут некоторый набор текстов по приторможенному в 2015 году проекту создания языка системного моделирования SysMoLan — https://ailev.livejournal.com/1443879.html

Сейчас обсуждается идея о том, чтобы реализовать этот язык в варианте встроенного в Julia DSL.
источник

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
на 0.6.4 результаты похуже, и у ar_equal4 едет крыша по аллокациям и скорости, видимо, они каждый маленький float заново аллоцируют, иначе объяснить не могу. ar_equal1v начинает вести себя тоже нехорошо, но не настолько. Остальные только чуть медленнее.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
А почему так?
```
y =  [x for x in 1:10_000_000]
v = [x for x in 1:10_000_000]
```
Вроде классично

y = collect(1:10_000_000)
v = collect(1:10_000_000)
источник

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
да, ссори, я не мог вспомнить название этой функции, у меня она почему-то как consume всплывала, подумал, что из залетного пакета была
источник

DP

Dmitry Penzar in Язык программирования Julia / Julia programming language
Для Julia1.0. Для случая равенства
 51.832 ms (4 allocations: 152.59 MiB)
 9.801 ms (2 allocations: 96 bytes)
 9.747 ms (2 allocations: 64 bytes)
 9.953 ms (2 allocations: 64 bytes)
 9.307 ms (0 allocations: 0 bytes)

Если в середину вставляю неравный элемент:
 44.526 ms (4 allocations: 152.59 MiB)
 4.843 ms (2 allocations: 96 bytes)
 4.535 ms (2 allocations: 64 bytes)
 4.552 ms (2 allocations: 64 bytes)
 4.616 ms (0 allocations: 0 bytes)

Видимо, разница просто в пределах отклонения (на другом запуске второе быстрее было). Случайно не то вставил, отредачил
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
спасибо, глянем дома! ))
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Надо ещё глянуть, что будет, если смотреть много раз по небольшим кусочкам
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Наподобие
for i in 1 : 10_000
Сравнить кусочки длины 100 в v и у
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Посоветуйте аналоги на русском книге CTM, сорри если оффтоп.
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
источник
2018 August 31

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Несколько замечаний:
1. В Benchmarktools надо использовать интерполяцию, иначе результаты получаются некорректными.
То есть вместо @btime ar_equals3(y, v, 2, 999999) надо писать @btime ar_equals3($y, $v, 2, 9999999)
На моей машине (c julia 1.0) разница такая:
v1 = collect(1:10_000)
v2 = collect(1:10_000)

@btime ar_equals3(v1, v2, 2, 9999)
# 16.194 μs (3 allocations: 96 bytes)

@btime ar_equals3(v1, v2, 2, 9999)
# 15.882 μs (0 allocations: 0 bytes)

то есть немного дольше работает и появляются дополнительные аллокации
источник