Help on slow attribute copy

Discussion in 'Python' started by wout, May 18, 2005.

  1. wout

    wout Guest

    Hi there,

    I am fairly new to python, the problem is as follows:

    newnodes = {}
    for i in nodes:
    newnodes[i.label] = i.coordinate

    is very slow, which is due to the dots, I know that for functions the
    dot lookup
    can be done outside the loop, can this be done for attributes in any
    way? (in such a way that it is fast)
    Coordinate is a tuple in this case, filling a dictionary of that size is
    no problem without dots.
    I use python 2.0 as shipped with abaqus, there are about 100000 nodes
    in the current case, and more to come, and the
    system can be stuck on this for 15+ minutes :-(

    Greetings
    Wout







    This message has been checked for viruses but the contents of an attachment
    may still contain software viruses, which could damage your computer system:
    you are advised to perform your own checks. Email communications with the
    University of Nottingham may be monitored as permitted by UK legislation.
     
    wout, May 18, 2005
    #1
    1. Advertising

  2. wout

    bgs Guest

    There's no way that loop takes fifteen minutes just because of the dot
    operator. I mean, 200000 dots in 15 minutes is 200 dots/second. On a
    1 GHz machine, that would be 5 million cycles per dot. That does not
    seem reasonable (assuming you haven't overridden the dot operator to do
    something more complicated than normal).

    Check that i.label does not have __hash__ overridden in a bad way. I
    tried a test case with __hash__ overridden to always return the same
    integer, and I got performance about what you are describing when I
    tried your example loop with 100000 iterations.

    And, of course, make sure you are not low on memory and relying too
    heavily on swap space.
     
    bgs, May 19, 2005
    #2
    1. Advertising

  3. wout

    wout Guest

    bgs wrote:

    >There's no way that loop takes fifteen minutes just because of the dot
    >operator. I mean, 200000 dots in 15 minutes is 200 dots/second. On a
    >1 GHz machine, that would be 5 million cycles per dot. That does not
    >seem reasonable (assuming you haven't overridden the dot operator to do
    >something more complicated than normal).
    >
    >Check that i.label does not have __hash__ overridden in a bad way. I
    >tried a test case with __hash__ overridden to always return the same
    >integer, and I got performance about what you are describing when I
    >tried your example loop with 100000 iterations.
    >
    >And, of course, make sure you are not low on memory and relying too
    >heavily on swap space.
    >
    >
    >

    bgs,
    thanks for the quick reply
    I don't think it's due to the .label, maybe too, but when I take it out
    it is still slow (due to the .coordinate)
    here's the abaqus stuff:
    >>> print mdb.model['Model-1'].rootAssembly.instance['blok'].nodes[1]

    ({'coordinate': (3.01000022888184, 5.01000022888184, 0.53123539686203),
    'coordinates': (3.01000022888184, 5.01000022888184, 0.53123539686203),
    'instanceName': 'blok', 'label': 2})
    >>> nodes = mdb.model['Model-1'].rootAssembly.instance['blok'].node
    >>> for i in nodes:

    .... dummy = i.coordinate
    wait for half an hour....
    The machine is p4 with 1GB ram so should be ok,
    running fedora 3

    Thanks
    Wout

    This message has been checked for viruses but the contents of an attachment
    may still contain software viruses, which could damage your computer system:
    you are advised to perform your own checks. Email communications with the
    University of Nottingham may be monitored as permitted by UK legislation.
     
    wout, May 19, 2005
    #3
  4. wout

    bgs Guest

    Hmm, it looks like the dot operator has been overloaded to do something
    complicated. (although if you haven't already, try "for i in nodes:
    pass" just to make sure). Is it retrieving the data from the network
    somewhere? If so, then it looks like it is probably retrieving each
    coordinate individually on each iteration of the loop. Perhaps there
    is some way of retrieving them all in one bunch?

    It's difficult to say more without knowing anything about abaqus and
    its interface.
     
    bgs, May 19, 2005
    #4
  5. wout

    wout Guest

    bgs wrote:

    >Hmm, it looks like the dot operator has been overloaded to do something
    >complicated. (although if you haven't already, try "for i in nodes:
    >pass" just to make sure). Is it retrieving the data from the network
    >
    >

    I tried that (the pass), that runs fast as it should

    >somewhere? If so, then it looks like it is probably retrieving each
    >coordinate individually on each iteration of the loop. Perhaps there
    >is some way of retrieving them all in one bunch?
    >
    >

    I guess it is looking up the node locations from the database with
    individual queries. As the source for the interface is not provided
    (only pyc) I will not find out.

    >It's difficult to say more without knowing anything about abaqus and
    >its interface.
    >

    I'll look for a 'heap lookup', otherwise I'll have to do text parsing...
    Thanks loads anyway
    Wout
     
    wout, May 19, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    3
    Views:
    3,091
  2. HK
    Replies:
    3
    Views:
    481
  3. mike
    Replies:
    3
    Views:
    419
    Virgil Green
    Jul 11, 2005
  4. Alex
    Replies:
    2
    Views:
    1,293
  5. Replies:
    26
    Views:
    2,181
    Roland Pibinger
    Sep 1, 2006
Loading...

Share This Page