I've been playing with cython lately on another project, and I decided to
see what would happen if I did some Maya operations with it.
I made a really contrived example of wildcard selecting over 5000 spheres
and doing some string filtering to the results before returning a list.
Interestingly, cython gave at least a 35% speedup over the Maya Python API
2.0 approach.

Makes me think that a lot of more specialized operations could be heavily
sped up that way by moving them over into a C++ environment of execution.



On Sun, Aug 5, 2012 at 8:52 PM, Matt Estela <[email protected]> wrote:

> Damnit. :/
>
>
> On Monday, August 6, 2012, Justin Israel wrote:
>
>> Yea, it was introduced after Maya 2012. Marco is right though, it is even
>> faster:
>>
>> import maya.api.OpenMaya as om2
>>
>> start = time.time()
>>
>> search = "nurbsSphereShape*"
>> sel = om2.MGlobal.getSelectionListByName(search)
>> depFn = om2.MFnDependencyNode()
>>
>> for i in xrange(sel.length()):
>>     mObj = sel.getDependNode(i)
>>     depNode = depFn.setObject(mObj)
>>     depNode.findPlug("castsShadows", True).setBool(True)
>>
>> end = time.time()-start
>> print ('api2.0 = %s' % end)
>>
>> # api2.0 = 0.123915910721
>>
>>
>>
>>
>>
>> On Aug 5, 2012, at 7:31 PM, Matt Estela wrote:
>>
>> We're locked to maya2011, API2.0 is a 2012 thing right?
>>
>>
>> On Monday, August 6, 2012, Marco D'Ambros wrote:
>>
>> the first question is:
>>
>> did you use the api 2.0 or the "normal one"?
>> the new api suppose to be faster ( almost 3 times more ).
>> --------------------------------
>> Marco D'Ambros
>> phone : (+61) (0) 435809628
>> web    : www.marcodambros.com
>> mail    : [email protected]
>>
>>
>>
>> On Mon, Aug 6, 2012 at 11:00 AM, Justin Israel <[email protected]>wrote:
>>
>> Ah, I figured it out. The 'add' method using a wildcard on a
>> MSelectionList is super slow. If you use MGlobal to fill the list for you,
>> it apparently does it more efficiently:
>>
>>
>> start = time.time()
>>
>> search = "nurbsSphereShape*"
>> sel = om.MSelectionList()
>> om.MGlobal.getSelectionListByName(search, sel)
>> iter = om.MItSelectionList(sel)
>> depFn = om.MFnDependencyNode()
>> mObj = om.MObject()
>>
>> while not iter.isDone():
>>     iter.getDependNode( mObj )
>>      depFn.setObject(mObj)
>>     depFn.findPlug("castsShadows").setBool(True)
>>     iter.next()
>>
>> end = time.time()-start
>> print ('api = %s' % end)
>> # api = 0.212560892105
>>
>>
>>
>> On Aug 5, 2012, at 5:36 PM, Justin Israel wrote:
>>
>> This is an interesting approach:
>>
>> start = time.time()
>>
>> cmds.select('nurbsSphereShape*')
>> size = len(cmds.ls(sl=True))
>> cmds.setAttr(".castsShadows", *(1 for _ in xrange(size)))
>>
>> end = time.time()-start
>> print end
>> # 0.243406057358
>>
>> ... Though an extra slow down happens if you have to deselect.
>>
>>
>>  On Aug 5, 2012, at 5:17 PM, Matt Estela wrote:
>>
>> (cc my reply to the group)
>>
>>
>>
>> On Mon, Aug 6, 2012 at 9:16 AM, Matt Estela <[email protected]>wrote:
>>
>> Yeah, again it was a contrived example, in production lighters will
>> definitely be using whatever bizarro wildcards they can muster.
>>
>> As you say it appears to be a core limitation of wildcards, will have to
>> rethink how we let lighters define object selections. In this case maybe we
>> just can't let lighters use wildcards, instead they'll have to pre-define
>> it using sets. Or possibly pre-filtering to specific object types, and
>> running list comprehensions on that.
>>
>> Hmm, houdini's smart bundles would come in handy here... (dynamic sets
>> based on wildcards, they run surprisingly fast)
>>
>> Thanks again for the help Justin, you saved me several days worth of
>> research. :)
>>
>>
>>
>>
>> On Mon, Aug 6, 2012 at 5:15 AM, Justin Israel <[email protected]>wrote:
>>
>> Ya, in some cases you can't beat the python commands module if you are
>> only doing a single command. Most of the work is happening behind the
>> scenes in C++. The wildcard searches just appear to be beasty no matter
>> what.
>>
>> But considering you didn't need a wildcard pattern, and instead just want
>> to say "Apply to all nurbsSurface objects under this root:
>>
>> #
>> # cmds
>> #
>> start = time.time()
>> sel =cmds.listRelatives('|set', ad=True, type="nurbsSurface")
>> for each in sel:
>>     cmds.setAttr("{0}.castsShadows".format(each), 1)
>> end = time.time()-start
>> print ('cmds = %s' % end)
>> # ** cmds = 0.290652990341 **
>>
>> #
>> # api
>> #
>> start = time.time()
>>
>> sel = om.MSelectionList()
>>
>>  --
>> view archives: http://groups.google.com/group/python_inside_maya
>> change your subscription settings:
>> http://groups.google.com/group/python_inside_maya/subscribe
>>
>  --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>

-- 
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe

Reply via email to