When to use bmesh.update_edit_mesh and when Mesh.update?
The mesh data used by an object is stored within object.data, the most obvious data being stored within the vertices, edges and polygons properties.

When you add or alter edges or polygons you need to use object.data.update() to see the changes in the 3dview.

To see this working, start with a default cube in wireframe shading and enter the following into a python console.

odata = bpy.data.objects['Cube'].data
odata.edges[8].vertices[0] = 3
odata.edges[8].vertices[1] = 5


You shouldn't see any difference yet, now enter

odata.update()


and you will see one of the edges is now across the top face and not on the side.

Instead of directly editing the mesh data, it is preferred to use the extra functionality provided in the bmesh module. The function bmesh.from_edit_mesh() makes a copy of the mesh data that you can make changes to while the object is in edit mode, the changes you make remain in this copy until you call bmesh.update_edit_mesh(), this lets you add 10,000 faces and then do one refresh to reduce the amount of drawing/copying needed. If you directly alter the object data while the object is in edit mode then those changes will be lost as the bmesh edit_mesh will overwrite any changes upon exiting edit mode.

Similar to bmesh.from_edit_mesh() and bmesh.update_edit_mesh() we also have bm.from_mesh() and bm.to_mesh() which allow us to edit the mesh data while the object remains in object mode. (these are available after bm = bmesh.new())