3DCGbook

映像プロダクションに所属しています。主に毎日のアウトプットを配信していこうと思います。

パフォーマンステストからわかるPyMELの重さ

前回に引き続き、パフォーマンステストブームなので…。
今回は3000個のpolySphereの法線をチェックする場合の時間を計ってみました。

結果

ライブラリ 時間(秒)
maya.cmds 14.5990002155
pymel.core 47.5500001907
Python API 1.0 0.258000135422
Python API 2.0 0.0889999866486

結果について

思っていた以上に差が出ました。
ノード1つだったら場合によってはPyMELの方が早かったりもしたので、
テストで使う場合はPyMELを使う選択はいいと思われます。
PyMelのconnectAttrとかはわかりやすくて好きですし。

コード

import maya.cmds as cmds
import pymel.core as pm
import maya.OpenMaya as oldOM
import maya.api.OpenMaya as newOM

def cmdsCheckVtxNormal(*args):
    nodes = cmds.ls(sl=True)
    for node in nodes:
        numVtxs = cmds.polyEvaluate(node,v=True)
        for n in xrange(numVtxs):
            cmds.polyNormalPerVertex("%s.vtx[%s]" %(node,n),q=True,freezeNormal=True)

def pymelCheckVtxNormal(*args):
    nodes = pm.ls(sl=True)
    for node in nodes:
        numVtxs =  node.numVertices()
        for n in xrange(numVtxs):
            pm.polyNormalPerVertex("%s.vtx[%s]" %(node,n),q=True,freezeNormal=True)
            
def openMayaCheckVtxNormal(*args):
    sel = oldOM.MSelectionList()
    meshFn = oldOM.MFnMesh()
    obj = oldOM.MObject()
    oldOM.MGlobal.getActiveSelectionList(sel)
    iter = oldOM.MItSelectionList(sel)
    while not iter.isDone():
        iter.getDependNode(obj)
        meshFn.setObject(obj)
        numNormals = meshFn.numNormals()
        for n in xrange(numNormals):
            meshFn.isNormalLocked(n)
        iter.next()

def openMaya2CheckVtxNormal(*args):
    sel = newOM.MGlobal.getActiveSelectionList()
    meshFn = newOM.MFnMesh()
    iter = newOM.MItSelectionList(sel)
    while not iter.isDone():
        obj = iter.getDependNode()
        meshFn.setObject(obj)
        numNormals = meshFn.numNormals
        for n in xrange(numNormals):
            meshFn.isNormalLocked(n)
        iter.next()



Practical Maya Programming with Python
Packt Publishing (2014-07-25)