John, Currently (v0.5) : Which uses of non-concrete types are performance friendly? What ways of using abstract types are a drag on performance?
Regards, Jeffrey On Sunday, October 30, 2016 at 9:38:15 PM UTC-4, John Myles White wrote: > > Working with non-concrete types is often a problem for performance, so > this approach may not be very efficient compared with alternatives that are > more careful about the use of concrete types. > > --John > > On Sunday, October 30, 2016 at 6:27:47 PM UTC-7, Ralph Smith wrote: >> >> Conversion is done by methods listed in base/nullable.jl >> >> I would like to know if there is any drawback to an alternative like >> >> abstract Bst >> >> immutable NullNode <: Bst end >> >> type BstNode <: Bst >> val::Int >> left::Bst >> right::Bst >> end >> >> isnull(t::Bst) = isa(t,NullNode) >> >> BstNode(key::Int) = BstNode(key, NullNode(), NullNode()) >> >> which appears to be good for type-safety, and is (sometimes) slightly >> faster and less cumbersome than Nullables. >> >> On Sunday, October 30, 2016 at 6:24:42 PM UTC-4, Ángel de Vicente wrote: >>> >>> Hi, >>> >>> by searching in the web I found >>> ( >>> http://stackoverflow.com/questions/36383517/how-to-implement-bst-in-julia) >>> >>> a way to make my BST code much cleaner (as posted below). Nevertheless, >>> I don't find this very ellegant, since the head node is of type Bst, >>> while the children are of type Nullable{Bst} (is this the 'canonical' >>> way >>> of building recursive data structures with Julia?). >>> >>> But when I first read the code in SO, I thought that it was probably >>> wrong, since it does: >>> >>> node.left = BST(key) >>> where node.left is of type Nullable{BST}. >>> >>> Then I realized that automatic conversion from BST to Nullable{BST} is >>> done when assigning to node.left, so all is good. Coming from Fortran, >>> this is a bit odd for me... what are the rules for automatic conversion? >>> >>> >>> >>> Thanks a lot, >>> Ángel de Vicente >>> >>> >>> >>> >>> >>> ,---- >>> | module b >>> | >>> | type Bst >>> | val::Int >>> | left::Nullable{Bst} >>> | right::Nullable{Bst} >>> | end >>> | Bst(key::Int) = Bst(key, Nullable{Bst}(), Nullable{Bst}()) >>> | >>> | "Given an array of Ints, it will create a BST tree, type: Bst" >>> | function build_bst(list::Array{Int,1}) >>> | head = list[1] >>> | tree = Bst(head) >>> | for e in list[2:end] >>> | place_bst(tree,e) >>> | end >>> | return tree >>> | end >>> | >>> | function place_bst(tree::Bst,e::Int) >>> | if e == tree.val >>> | println("Dropping $(e). No repeated values allowed") >>> | elseif e < tree.val >>> | if (isnull(tree.left)) >>> | tree.left = Bst(e) >>> | else >>> | place_bst(tree.left.value,e) >>> | end >>> | else >>> | if (isnull(tree.right)) >>> | tree.right = Bst(e) >>> | else >>> | place_bst(tree.right.value,e) >>> | end >>> | end >>> | end >>> | >>> | function print_bst(tree::Bst) >>> | if !isnull(tree.left) print_bst(tree.left.value) end >>> | println(tree.val) >>> | if !isnull(tree.right) print_bst(tree.right.value) end >>> | end >>> | >>> | end >>> `---- >>> >>> ,---- >>> | julia> include("bst.jl") >>> | >>> | julia> b.print_bst( b.build_bst([4,5,10,3,20,-1,10])) >>> | Dropping 10. No repeated values allowed >>> | -1 >>> | 3 >>> | 4 >>> | 5 >>> | 10 >>> | 20 >>> | >>> | julia> >>> `---- >>> >>> >>> -- >>> Ángel de Vicente >>> http://www.iac.es/galeria/angelv/ >>> >>