Skip to content

[python] Do create copies of local trees

Carsten Gräser requested to merge bugfix/python-avoid-tree-copy into master

In C++, localView.tree() hands out a reference to a single Tree stored within the LocalView. In Python this was different so far: A Python LocalView wrapper hands out a new Python Tree wrapper object which itself stores a copy of the C++ Tree leading to many copies. While these copies are in principle expensive, this is hardly measurable due to the large overhead of the bindings. However this has several other implications. First, it's not guaranteed that the C++ Tree is safely copyable. Second, the following pattern works in C++ but not in Python:

localView = basis.localView()
tree = localView.tree()
for element in basis.gridView.elements:
  localView.bind(element)
  # Here we cannot use tree because it's not bound.
  # Furthermore we have now tree != locaView.tree()

This patch changes the holder type in the Python wrapper for Tree to std::shared_ptr<Tree> instead of the default std::unique_ptr<Tree> and lets the LocalView wrapper hand out Dune::stackobject_to_shared_ptr(localView.tree()) such that the Tree wrapper always points to the C++ Tree within the LocalView.

This also makes the above pattern work which is indeed measurably faster that calling localView.tree() on and on within the loop.

Merge request reports