How is Python designed?
Diez B. Roggisch
deetsNOSPAM at web.de
Wed Dec 8 13:19:49 EST 2004
> No, in the depth-traversal implementation, a function
> can avoid calling itself (at least in my
> implementation it's like this).
How so? It has to keep state of which nodes to visit - so instead of calling
trav, you call functions to store and fetch nodes in a container like a
stl-list. That's the same cost, function-call is function call.
There is no difference - you simply decoupled the tree traversal from the
evaluation - but combined, its the same effort. It's like in my second
example with bytecodes - the traversal is done beforehand (and only once),
and then the eval is only done on the nodes in a row.
> Because you can write seperate functions: a function
> for depth-traversal (say trav()) and another function
> for evaluation (say eval()). trav() may call eval().
> And eval() NEVER call other functions. For one
> arithmetic tree, trav() is called once, and eval() is
> called by trav() at each node. So it is not recursive.
>> Now apart from that, I still fail to see where your
>> method of evaluation has
>> any speed gains.
>
> And if you inplement eval() as an "inline" function,
> there will be no cost for function calls for eval().
> In this way it can gain some speeds.
No. Inlining works only when the actual type of your node is known, e.g.
like this (Constant and Variable are both of type :
{
Constant left;
Variable right;
left.eval();
right.eval();
}
Here the compiler can take advantage from the fact that it knows at
compiletime which eval to inline
But if you have
{
list<Node> nodes;
for(nodes::iterator it = nodes.begin(); it != nodes.end(); it++) {
(*exp).eval();
}
}
the compiler can't possibly know which node is in exp- so it has to resort
to a vtable-lookup and a method call on the result.
--
Regards,
Diez B. Roggisch
More information about the Python-list
mailing list