Hi Blaine, Thanks for your help. I don't think what you suggest is going to solve the problem. The loop itself is quite fast, and I don't need to perform anything else in the loop other than adding those bonds. I already have a list of tuples [(atom1, atom2), (atom3, atom4)] and all I need to do is create a bond between each pair. The bottleneck is the bond function, not the loop itself.
Also, I doubt simply the speed difference between C++ and Python could explain such a drastic difference (minutes against fractions of a second). There is clearly a difference in the way the `bond` command is implemented and the way bonds are generated at startup. What I think is needed, is either a way for pymol to perform those actions in parallel (unlikely) or a way to get my hands on the way bonds are generated at startup and use those functions or at least the same approach. Thank you, Lorenzo Il giorno sab 25 mag 2019 alle ore 16:23 Mooers, Blaine H.M. (HSC) < blaine-moo...@ouhsc.edu> ha scritto: > Hi Lorenzo, > > You can import numpy and replace your lists of coordinates with NumPy > arrays. > Operations with numpy arrays can be >100 times faster than with lists in > for loops. > See the last example the following blog post for inspiration: > > > https://medium.freecodecamp.org/if-you-have-slow-loops-in-python-you-can-fix-it-until-you-cant-3a39e03b6f35 > . > > Please recall that PyMOL is collection of C and C++ programs wrapped by > Python. > The fast display of bonds inside the viewport is due to C or C++ programs. > > Best regards, > > Blaine > > Blaine Mooers, Ph.D. > Associate Professor > Department of Biochemistry and Molecular Biology > College of Medicine > University of Oklahoma Health Sciences Center > S.L. Young Biomedical Research Center (BRC) Rm. 466 > 975 NE 10th Street, BRC 466 > Oklahoma City, OK 73104-5419 > > ________________________________________ > From: Lorenzo Gaifas [bris...@gmail.com] > Sent: Saturday, May 25, 2019 5:48 AM > To: pymol-users@lists.sourceforge.net > Subject: [EXTERNAL] [PyMOL] Absymal performance when creating large > numbers of bonds > > Dear pymol users, > > I'm working on a script, using the python API, that needs to add a very > large number of bonds to the loaded structure. > > I thought simply using cmd.bond() in a for loop would do the trick, but > -even though it works- it is extremely slow. I figured something was fishy, > since pymol at startup is almost istantaneous and there, too, it has to > compute, draw and even guess equally large numbers of bonds. > > I also tried to parallelise the command, but by now I *think* this can't > be done due to the Global Intepreter Lock. > > I feel like there must be something I'm missing (maybe a way to prevent > pymol from updating the rendering between each cmd.bond call?) or at least > an API function that better exposes the bond generation procedure. Does > someone have suggestions on how to solve this problem? > > Cheers, > Lorenzo >
_______________________________________________ PyMOL-users mailing list Archives: http://www.mail-archive.com/pymol-users@lists.sourceforge.net Unsubscribe: https://sourceforge.net/projects/pymol/lists/pymol-users/unsubscribe