You can convert it much faster with:

weights = map(list, sel(0).Envelopes(0).Weights.Array)


In my box here at work it went from 17.81 seconds down to 7.9s with the
line above.



On Thu, May 30, 2013 at 4:59 PM, Eric Thivierge <[email protected]>wrote:

>  Thanks Alok,
>
> I do not think that the slowness is from converting the tuple to lists
> more that the access time to the Weights.Array is slow as I see the
> slowness (~5 seconds) when I don't even convert it.
>
>
> Eric Thivierge
> ===============
> Character TD / RnD
> Hybride Technologies
>
>
> On 30/05/2013 4:56 PM, Alok Gandhi wrote:
>
> Use numpy : http://www.numpy.org/
>
>
> On Thu, May 30, 2013 at 4:42 PM, Eric Thivierge <[email protected]>wrote:
>
>>  Well all my code is doing is creating a list of lists from the weights
>> array nothing more.
>>
>> Should I consider this speed not slow then? When running various tools
>> that use this call to the weights array it seems extremely slow. Am I just
>> being impatient or on meshes with this density and number of deformers is
>> it to be expected? Should I accept it or look for other ways to speed it up?
>>
>> Opinions welcome.
>>
>>
>> Eric Thivierge
>> ===============
>> Character TD / RnD
>> Hybride Technologies
>>
>>
>>   On 30/05/2013 4:38 PM, Jeremie Passerin wrote:
>>
>> just tested your scenario... got the same result here :D
>> Actually your code is faster than mine
>>
>>
>> On 30 May 2013 13:21, Eric Thivierge <[email protected]> wrote:
>>
>>>  Thanks Jeremie,
>>>
>>> I was referencing your code when I ran into the slowness to see if we
>>> are doing anything different and we aren't really.
>>>
>>> As a test I'm grabbing the XSI Man Armored and selecting the body mesh
>>> and doing a local subdiv refinement with a setting of 2 then freezing
>>> modeling. Then running the following code with the body mesh selected:
>>>
>>> # Python
>>> # =============================================
>>> from platform import system as OStype
>>> from time import clock
>>>
>>> xsi = Application
>>> log = xsi.LogMessage
>>> sel = xsi.Selection
>>>
>>> start_time = clock()
>>>
>>> weights = [list(x) for x in sel(0).Envelopes(0).Weights.Array]
>>>
>>> timeTaken = clock() - start_time
>>>
>>> units = ["seconds" if OStype() is "Windows" else "milliseconds"][0]
>>> msg = "It took "+str(timeTaken)+" "+units+" to process your code."
>>>
>>> log(msg)
>>> # =============================================
>>>
>>> It's taking around 6 seconds for me.
>>>
>>>
>>>
>>> Eric Thivierge
>>> ===============
>>> Character TD / RnD
>>> Hybride Technologies
>>>
>>>
>>>   On 30/05/2013 4:05 PM, Jeremie Passerin wrote:
>>>
>>> Writting to the envelope array is usually pretty fast for me... what's
>>> taking time (in my case) is doing all the normalization of values...
>>>
>>> This is how I read my weights :
>>>
>>> def getWeights(envelopeOp):
>>>   weightsTuple = envelopeOp.Weights.Array
>>>  return [weightsTuple[j][i] for i in range(len(weightsTuple[0])) for j
>>> in range(len(weightsTuple))]
>>>
>>>  This is an example of how I set the weights (average weights) :
>>>
>>> def averageWeights(envelopeOp, points=None):
>>>  '''
>>>  \remarks set the weights of given points to the average weights of
>>> given points
>>>  \param envelopeOp Envelope Operator - the envelope operator.
>>>  \param points List of Integer - Index of vertices to average.
>>>  '''
>>>
>>>  deformerCount = envelopeOp.Deformers.Count
>>>  weightsTuple = envelopeOp.Weights.Array
>>>  weights = getWeights(envelopeOp)
>>>   if points is None:
>>>  points = range(mesh.ActivePrimitive.Geometry.Points.Count)
>>>   a = [0] * deformerCount
>>>  for pointIndex in points:
>>>  for def_index in range(deformerCount):
>>>  a[def_index] +=  weightsTuple[def_index][pointIndex]
>>>
>>>  for pointIndex in points:
>>>  for def_index in range(deformerCount):
>>>  weights[pointIndex*deformerCount + def_index] =
>>> a[def_index]/len(points)
>>>   envelopeOp.Weights.Array = weights
>>>
>>>
>>> On 30 May 2013 12:58, Eric Thivierge <[email protected]> wrote:
>>>
>>>> Anyone know if there is a way to speed up reading and writing speeds to
>>>> the Weights Array for envelopes? It's extremely slow on high point count /
>>>> high deformer count meshes.
>>>>
>>>> I'm using Python but I'm not sure if that is the reason for the
>>>> slowness. Anyone else already do some testing or have any findings that may
>>>> help?
>>>>
>>>> I'm writing some common tools that many have already done such as
>>>> normalizing weights, pruning, symmetrizing, etc.
>>>>
>>>> Any experiences confirming this slowness or experiences where it is
>>>> exponentially faster in other languages are welcome too.
>>>>
>>>> Thanks,
>>>>
>>>> --
>>>>  Eric Thivierge
>>>> ===============
>>>> Character TD / RnD
>>>> Hybride Technologies
>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
>  --
>
>
>

Reply via email to