On 2/3/10 6:23 PM, B.A.D.C.M.D Santos wrote: > ?! phyper is deterministic, I think. Calling it with the same parameters > will give the same results. > > Good point, that it is in fact an excellent improvement. I will start > storing everything already computed on a dictionary.
Avoiding to recompute several times the same thing seems like a good early step toward optimization (and may make the move to the lower-level interface not so important). > Anyway I was able to easily solve the problem with the mapping by > adding: myparams = > {'lower.tail':rinterface.SexpVector([False,],rinterface.LGLSXP),'log.p': > rinterface.SexpVector([True,],rinterface.LGLSXP)} > > I tried your code partially since I don't know what you mean with: As stated, but may be not stressed enough, this is for rpy2-2.1.0. L. > import rpy2.robjects as robjects > from rpy2.robjects.pacakges import importr > > # this steps performs an early binding of all objects > # in the R package "stats" > stats = importr("stats") > > rpy2.robjects has no module called packages or something similar. I know > have everything in low level. I just don't like the fact that I need to > create an RVector everytime I change the parameters to the phyper. Here > it is how the code looks at the moment: import rpy2.rinterface as > rinterface rinterface.initr() phyper = > rinterface.globalEnv.get("phyper") myparams = > {'lower.tail':rinterface.SexpVector([False,],rinterface.LGLSXP),'log.p': > rinterface.SexpVector([True,],rinterface.LGLSXP)} ..... ..... def > lphyper(self,q,m,n,k): > """ > loc.phyper(q,m,n,k) > Calculate p-value using R function phyper from rpy2 low-level > interface. > """ > phyper_q = rinterface.SexpVector([q,], rinterface.INTSXP) > phyper_m = rinterface.SexpVector([m,], rinterface.INTSXP) > phyper_n = rinterface.SexpVector([n,], rinterface.INTSXP) > phyper_k = rinterface.SexpVector([k,], rinterface.INTSXP) > return phyper(phyper_q,phyper_m,phyper_n,phyper_k,**myparams)[0] > > > I had solve the problem by reading the robjects code. Not sure if yours > is a better option but for the bits I was able to port don't seem to > make difference in such a small dataset. I will test with a larger > dataset to see if I can spot any significant difference. robjects is reasonably optimized for general usage, I am afraid. Back to the comment > Once more. Thank you very much you have been helping a lot. Bruno > 2010/2/3 Laurent Gautier <lgaut...@gmail.com> > On 2/3/10 3:00 PM, B.A.D.C.M.D Santos wrote: > The main reason I was trying to move to the low level interface is > speed. So what I am doing is calculating several times the p-value for > the same python object. > > ?! phyper is deterministic, I think. Calling it with the same parameters > will give the same results. > > > > So I bind phyper to the object and then just > perform the test several times. This already improved the speed a lot, > compared to simply calling rinterface.phyper everytime. > > There is no such thing as rinterface.phyper by default, but I think that > I understand what you mean ( rinterface.baseenv.get("phyper") ). Early > binding is definitely improving things. This may even make rpy2 faster > than the same code in R, in some cases. > > # -- for rpy2-2.1.0 (written without actually running it) > > import rpy2.robjects as robjects > from rpy2.robjects.pacakges import importr > > # this steps performs an early binding of all objects > # in the R package "stats" > stats = importr("stats") > > # save the Python lookup in stats. > phyper = stats.phyper > > # cast to low-level (to cut the automagic conversion of Python objects) > lowlevel_phyper = robjects.conversion.py2ri(phyper) > > my_q = robjects.IntVector((0, )) > my_m = robjects.IntVector((0, )) > my_n = robjects.FloatVector((0, )) > my_k = robjects.FloatVector((0, )) > > # you can note that high-level and low-level objects > # can be inter-exchanged. > > results = lowlevel_phyper(my_q, my_m, my_n, my_k) > > # low-overhead change of a parameter > my_q[0] = 123 > > results = lowlevel_phyper(my_q, my_m, my_n, my_k) > > > At this point, you should profile your code, and the largest part of the > time should be spent in the call lowlevel_phyper(), and then there is > not much left to optimize (well... in fact there is probably the options > Rmaths library that could still push things a little faster). > > > > > But the problem > is that I am using this in huge sequence datasets, taking hours for a > single run. And the bottleneck is on the significance calculation which > is taking 3x more time than all the rest. > > In a very small dataset that I use for test using the low level > interface gives me less time to run it. Dropping from ~0.9s to ~0.8s so > I expect that using it on a large dataset will give me even more saving. > > I will take a look at the code and try to make sense of it. I just > though there was a better solution since it kind of points to that on > the documentation. > > Every code optimization problem can be different. I agree that the > documentation could be giving hints (it is planned, and there already a > section on perfomances), but will not replace knowing the API inside out. > > > > > L. > > > > > Thank you very much once more, > Bruno > 2010/2/3 Laurent Gautier <lgaut...@gmail.com> > On 2/3/10 12:32 PM, B.A.D.C.M.D Santos wrote: > Hello again, > > Today I was trying to port my phyper from the high-level interface to the > low-level interface. My problem is again how I map the arguments with dot. > According to the documentation I should be able to use the special **Kwargs > again. But I have no idea how to do this. I tried directly but it obviously > didn't work because the function was expecting Sexp_Type object. Can > someone give some light on this. > > Also is there any easy way to pass four parameters to phyper without > needing to create four Sexp_Type vectors individually? > > > Unless you have good reasons to move to the lower-level interface, I > would advice you to stay with the higher level interface. > > The higher level interface is mostly abstracting those details from you. > > If you really really want to do it at the lower level, you can study how > the higher level interface is doing it itself (it is implemented in > Python). An answer to your question would just be that code ;-) . > > > L. > > > > > > Thanks in advance, > Bruno > > 2010/2/2 B.A.D.C.M.D Santos<bac...@cam.ac.uk> > Thank you Laurent. I had completely forget that solution. It seems to be > working know, although I am getting some weird values. But I think the > problem is on my script. > > Thank you very much, > Bruno > > > 2010/2/2 Laurent Gautier<lgaut...@gmail.com> > On 2/2/10 12:40 PM, B.A.D.C.M.D Santos wrote: > Hello everyone, > > I am currently using rpy2 in order to use phyper function from R into my > Python script. Nevertheless I have a problem because I want to use the > argument log.p=TRUE. The last time I checked there was a problem with the > mapping of the arguments with dots in the middle. Is this still a bug? If > it is, is there any workaround to solve this? > > Did the link given earlier work for you ? > http://www.mail-archive.com/rpy-list@lists.sourceforge.net/msg02313.html > > > > Or does the new rpy2 alpha > solves this problem? > > It does provide a syntactic sugar for this. You can read more at: > http://rpy.sourceforge.net/rpy2/doc-2.1/html/robjects.html#functions > (the doc also tells to make a blind 'turn "." into "_"' function) > > > Hoping this helps, > > > L. > > > > > I am using: > Python 2.6.4 > R version 2.10.1 > rpy2 2.0.4 > > Thanks in advance, > Bruno > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the > business Choose flexible plans and management services without long-term > contracts Personal 24x7 support from experience hosting pros just a > phone call away. http://p.sf.net/sfu/theplanet-com > _______________________________________________ rpy-list mailing list > rpy-list@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rpy-list > > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the > business Choose flexible plans and management services without long-term > contracts Personal 24x7 support from experience hosting pros just a > phone call away. http://p.sf.net/sfu/theplanet-com > _______________________________________________ rpy-list mailing list > rpy-list@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rpy-list > > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the > business Choose flexible plans and management services without long-term > contracts Personal 24x7 support from experience hosting pros just a > phone call away. http://p.sf.net/sfu/theplanet-com > _______________________________________________ rpy-list mailing list > rpy-list@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rpy-list > ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ rpy-list mailing list rpy-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rpy-list