Size: a a a

2018 November 22

V

Vladimir in ru.nim.talks
ним, раст и питон в один
источник

V

Vladimir in ru.nim.talks
def get_partition(ss)
   if ss.size <= 1
       return [[ss]]
   end
   res = [[[] of Int32, [] of Int32]].clear # 10 sec
   # res = [[[] of Int32, [] of Int32]] # 12  sec
   (0...2**ss.size / 2).each { |i|
       parts = [[] of Int32, [] of Int32] # can't use .clear here, bcs neew el with ix=1
       ss.each { |item|
           parts[i&1] << item
           i >>= 1
       }
       get_partition(parts[1]).each { |b|
           res << (b[0].empty? ? [parts[0]] : [parts[0]] + b)
       }
   }
   res
end
источник

V

Vladimir in ru.nim.talks
это кристал
источник

M

MIT/Benzands in ru.nim.talks
ну короче какие-то странные вещи, говорю же) не распараллеливает pypy
источник

V

Vladimir in ru.nim.talks
да запусти проверь.
источник

M

MIT/Benzands in ru.nim.talks
Vladimir
да запусти проверь.
не хочу, потому что знаю
источник

M

MIT/Benzands in ru.nim.talks
а вот доказательства прям многопоточности хочу увидеть) к примеру в htop
источник

V

Vladimir in ru.nim.talks
вот на нем и посмотри. я смотрел
источник

M

MIT/Benzands in ru.nim.talks
> 404
источник

M

MIT/Benzands in ru.nim.talks
ну серьёзно, ты какую-то фигню уже начинаешь нести, нет никакой магической авто-параллелизации в go, crystal и pypy
источник

M

MIT/Benzands in ru.nim.talks
ты на винде запускал или где?
источник

M

MIT/Benzands in ru.nim.talks
и как определял, что многопоточно выполнялось?)
источник

V

Vladimir in ru.nim.talks
package main

import (
 "fmt"
 "math"
 "reflect"
)

func get_partitionr(ss []int) [][][]int {
 if len(ss) <= 1 {
   // fmt.Printf("first=&v\n", first)
   return [][][]int{{ss}}
 }
 to := int(math.Pow(2, float64(len(ss)))) / 2
 out := [][][]int{}
 ii := 0
 for i := 0; i < to; i++ {
   ii = i // need to use another var to avoid mutation of
   parts := [][]int{{}, {}}
   for _, item := range ss {
     ix := ii & 1
     parts[ix] = append(parts[ix], item)
     ii >>= 1
   }
   bb := get_partitionr(parts[1])
   for _, b := range bb {
     p := [][]int{parts[0]}
     for _, el := range b {
       if len(el) > 0 {
         p = append(p, el)
       }
     }
     out = append(out, p)
   }
 }
 return out
}

func main() {
 fmt.Println("golang version")
 part := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
 lr := get_partitionr(part)
 fmt.Println(len(lr))
 fmt.Printf("%v\n", reflect.TypeOf(lr))
 fmt.Printf("%v\n", lr[0:10])
}
источник

V

Vladimir in ru.nim.talks
на убунте я запускаю
источник

M

MIT/Benzands in ru.nim.talks
MIT/Benzands
и как определял, что многопоточно выполнялось?)
^
источник

V

Vladimir in ru.nim.talks
на htop смотрел
источник

M

MIT/Benzands in ru.nim.talks
Vladimir
на htop смотрел
мдя
источник

M

MIT/Benzands in ru.nim.talks
просто насчёт pypy я 100% говорю - там нет и не было никакой мультипоточности, только в STM ветке (и то нужно изменять код), которая заброшена и была экспериментом
источник

YG

Yuriy Glukhov in ru.nim.talks
наверное то был рантайм. богатые рантаймом языки любят создавать потоки без уважительной причины =)
источник

V

Vladimir in ru.nim.talks
rust version
4213597
real    0m14.859s
user    0m14.176s
sys     0m0.680s


pypy version
4213597
real    0m24.590s
user    0m11.332s
sys     0m1.172s


golang version
real    0m12.696s
user    0m22.524s
sys     0m1.032s


crystal version
Returned size is 4213597
real    0m10.147s
user    0m20.772s
sys     0m0.572s


nim version
4213597
real    0m27.355s
user    0m26.468s
sys     0m0.876s


python version
4213597
real    0m47.860s
user    0m47.208s
sys     0m0.648s
источник