Hi Lorenzo, Looks like the cmd.bond() function is indeed very inefficient. I've found a "TO DO: optimize for performance" comment in the code - that speaks for itself.
https://github.com/schrodinger/pymol-open-source/blob/master/layer2/ObjectMolecule.cpp#L4492 Parallelization is not the solution. You are probably right that a new API function is needed which allows you to directly add a bond by atom indices instead of atom selections. Cheers, Thomas > On May 25, 2019, at 5:11 PM, Lorenzo Gaifas <bris...@gmail.com> wrote: > > 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 -- Thomas Holder PyMOL Principal Developer Schrödinger, Inc. _______________________________________________ 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