Size: a a a

2018 November 21

AF

Amir Fazleev in ru.nim.talks
MIT/Benzands
т.е. весь код в proc main, и потом её вызови
Сделал, по сути ничего не изменилось, на секунду дольше отработала
источник

A

Andrew in ru.nim.talks
Amir Fazleev
Сделал, по сути ничего не изменилось, на секунду дольше отработала
Какие цифры на вход подавать?
источник

AF

Amir Fazleev in ru.nim.talks
3 4
источник

AF

Amir Fazleev in ru.nim.talks
На core i7 3610qm
источник

A

Andrew in ru.nim.talks
Да уж, задачка для процессора не из лёгких...
источник
2018 November 22

V

Vladimir in ru.nim.talks
go на уровне crystal считал похожую задачу
источник

V

Vladimir in ru.nim.talks
и они оба юзали все ядра. а раст и ним только одно. а здесь как?
источник

M

MIT/Benzands in ru.nim.talks
Vladimir
go на уровне crystal считал похожую задачу
мб потому что там использовали горутины в go?)
источник

V

Vladimir in ru.nim.talks
нет сам код без горутин. тоже такой а-ля числодробительный (там комбинации-перестановки в списках)
источник

M

MIT/Benzands in ru.nim.talks
Vladimir
нет сам код без горутин. тоже такой а-ля числодробительный (там комбинации-перестановки в списках)
ну хз, что-то не слышал что го магически распараллеливает задачу)
источник

V

Vladimir in ru.nim.talks
def get_partitionr(ss):
   # print('ss=', ss)
   if len(ss) <= 1:
       return [[ss]]
   out = []
   to_max = 2**len(ss)//2
   # print('to_max=', to_max)
   for i in range(to_max):
       # print('i=', i)
       parts = [[], []]
       for item in ss:
           parts[i&1].append(item)
           i >>= 1
       # print('parts=', parts)
       bb = get_partitionr(parts[1])
       # print('bb=', bb)
       for b in bb:
           c = [parts[0]] if b==[[]] else [parts[0]] + b
           # print('c=', c)
           out.append(c)
   return out

part = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lr = get_partitionr(part)
print(len(lr))
print(type(lr), lr[0:10])
источник

M

MIT/Benzands in ru.nim.talks
это питон, тут нет многопоточности)
источник

M

MIT/Benzands in ru.nim.talks
го покажи :D
источник

V

Vladimir in ru.nim.talks
import math
import sequtils
     
proc get_partitionr(ss: seq[int]): seq[seq[seq[int]]] {.noSideEffect.} =
   if ss.len <= 1:
       return @[@[ss]]
   # result = @[@[newSeq[int](0)]] # 31 sec
   result = newSeq[seq[seq[int]]](0) #  26 sec
   let to_max = (2 ^ ss.len) div 2 - 1
   for i in 0..to_max:
       var ii = i
       var parts = @[newSeq[int](0), newSeq[int](0)]
       for item in ss:
           parts[ii and 1].add item
           ii = ii shr 1
       let bb = parts[1].get_partitionr
       for b in bb:
           # var c = newSeq[seq[int]](len(b) + 1)
           var c = newSeq[seq[int]](0)
           if parts[0].len > 0:
               c = @[parts[0]]
           for el in b:
               if el.len > 0:
                   c.add el
           result.add c

echo "nim version"
let part = @[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let lr = get_partitionr part
echo len lr
# echo type(lr)
for i in 1..10:
   echo lr[i]
источник

M

MIT/Benzands in ru.nim.talks
Vladimir
import math
import sequtils
     
proc get_partitionr(ss: seq[int]): seq[seq[seq[int]]] {.noSideEffect.} =
   if ss.len <= 1:
       return @[@[ss]]
   # result = @[@[newSeq[int](0)]] # 31 sec
   result = newSeq[seq[seq[int]]](0) #  26 sec
   let to_max = (2 ^ ss.len) div 2 - 1
   for i in 0..to_max:
       var ii = i
       var parts = @[newSeq[int](0), newSeq[int](0)]
       for item in ss:
           parts[ii and 1].add item
           ii = ii shr 1
       let bb = parts[1].get_partitionr
       for b in bb:
           # var c = newSeq[seq[int]](len(b) + 1)
           var c = newSeq[seq[int]](0)
           if parts[0].len > 0:
               c = @[parts[0]]
           for el in b:
               if el.len > 0:
                   c.add el
           result.add c

echo "nim version"
let part = @[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let lr = get_partitionr part
echo len lr
# echo type(lr)
for i in 1..10:
   echo lr[i]
а зачем newSeq(0) делать?
источник

V

Vladimir in ru.nim.talks
pypy тоже в несколько потоков решает
источник

M

MIT/Benzands in ru.nim.talks
это наверное сама ОС распараллеливает
источник

M

MIT/Benzands in ru.nim.talks
pypy тоже однопоточен
источник

M

MIT/Benzands in ru.nim.talks
Vladimir
import math
import sequtils
     
proc get_partitionr(ss: seq[int]): seq[seq[seq[int]]] {.noSideEffect.} =
   if ss.len <= 1:
       return @[@[ss]]
   # result = @[@[newSeq[int](0)]] # 31 sec
   result = newSeq[seq[seq[int]]](0) #  26 sec
   let to_max = (2 ^ ss.len) div 2 - 1
   for i in 0..to_max:
       var ii = i
       var parts = @[newSeq[int](0), newSeq[int](0)]
       for item in ss:
           parts[ii and 1].add item
           ii = ii shr 1
       let bb = parts[1].get_partitionr
       for b in bb:
           # var c = newSeq[seq[int]](len(b) + 1)
           var c = newSeq[seq[int]](0)
           if parts[0].len > 0:
               c = @[parts[0]]
           for el in b:
               if el.len > 0:
                   c.add el
           result.add c

echo "nim version"
let part = @[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let lr = get_partitionr part
echo len lr
# echo type(lr)
for i in 1..10:
   echo lr[i]
newSeq нужен если известно заранее кол-во элементов
источник

M

MIT/Benzands in ru.nim.talks
чтобы сразу всю нужную память выделить
источник