How can I create many objects quickly?
Could also look at using from_pydata ? The following runs in 11 seconds on my Athlon pussbox.  Creating and freeing a bmesh for each new mesh seems a little overkill.

import bpy
import time


class Tetra():

    def object(self, scene):
        obj = bpy.data.objects.new("Tetra", self.mesh_from_pydata())
        scene.objects.link(obj)
        return obj

    def mesh_from_pydata(self):
        me = bpy.data.meshes.new("some_name")
        me.from_pydata(self.Verts, [], self.Faces)
        return me

    def __init__(self, verts):
        self.Verts = verts
        faces = []
        for i in range(4):
            faces.append([j for j in range(4) if j != i])
        self.Faces = faces

        pass


# test drive
context = bpy.context
scene = context.scene
start = time.time()
for x in range(5000):
    if not x % 100:
       print("Creating Object", x)
    tet = Tetra([(0.5,  0.5,  0.0), (0.5, -0.50, 0.0), (-0.5, 0.5,  0.0), (0.0,  0.0,  1.0)])
    obj = tet.object(scene)

end = time.time()
print("Done in %d seconds" % (end - start) )