A little experiment (YMMV) :
start = time.time()
for i in range(100):
vert = [(0, 1, 0),
(0, 0, 0),
(1, 1, 0),
(1, 0, 0)]
fac = [(0, 1, 3, 2)]
pl_data = bpy.data.meshes.new("My_Mesh")
pl_data.from_pydata(vert, [], fac)
pl_obj = bpy.data.objects.new(f"My_Plane_{i}", pl_data)
bpy.context.scene.collection.objects.link(pl_obj)
print(f"single data : {time.time() - start} sec")
start = time.time()
vert = [(0, 1, 0),
(0, 0, 0),
(1, 1, 0),
(1, 0, 0)]
fac = [(0, 1, 3, 2)]
pl_data = bpy.data.meshes.new("My_Mesh")
pl_data.from_pydata(vert, [], fac)
for i in range(100):
pl_obj = bpy.data.objects.new(f"My_Plane_{i}", pl_data)
bpy.context.scene.collection.objects.link(pl_obj)
print(f"shared data : {time.time() - start} sec")
start = time.time()
vert = [(0, 1, 0),
(0, 0, 0),
(1, 1, 0),
(1, 0, 0)]
fac = [(0, 1, 3, 2) for i in range(100)]
pl_data = bpy.data.meshes.new("My_Mesh")
pl_data.from_pydata(vert, [], fac)
pl_obj = bpy.data.objects.new(f"My_Plane", pl_data)
bpy.context.scene.collection.objects.link(pl_obj)
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = pl_obj
bpy.ops.mesh.separate(type='LOOSE')
print(f"separated data : {time.time() - start} sec")
single data : 0.05600118637084961 sec
shared data : 0.01999974250793457 sec
separated data : 0.12400054931640625 sec