Dear Jeroen, Le lundi 17 octobre 2016 09:58:38 UTC+2, Jeroen Demeyer a écrit : > > On 2016-10-17 09:53, Emmanuel Charpentier wrote: > > I need to use a fast random (complex) number generatot. > > > > The following : > > > > sage: %%cython > > ....: from sage.misc.prandom import random > > ....: cpdef complex crand(double x): > > ....: return x*random()+x*1j*random() > > > > > > is about 77 times faster than its Python equivalent : > > > > sage: def prand(x): > > ....: return CDF(2*(x*(random()-0.5)+I*x*(random()-0.5))) > > > > sage: %timeit foo=crand(8) > > The slowest run took 14.72 times longer than the fastest. This could > > mean that an intermediate result is being cached. > > 1000000 loops, best of 3: 810 ns per loop > > sage: 623000.0/810.0 > > 769.135802469136 > > sage: > > > > > > No small beer... > > > > However : > > > > sage: prand(8).parent() > > Complex Double Field > > sage: crand(8).parent() > > > --------------------------------------------------------------------------- > > AttributeError Traceback (most recent call > last) > > <ipython-input-112-473e92fbb9eb> in <module>() > > ----> 1 crand(Integer(8)).parent() > > > > AttributeError: 'complex' object has no attribute 'parent' > > > > Is there a way to return a CDF (or RDF) value from a Cython function ? > > 1. Exactly the same way you would do it for a Python function: CDF(x) >
Thanks ! Got that (partly with Cython's tutorial). It seems that I have to add "from sage.rings.complex_double import CDF" in the Cython fragment : I can't compile without a "from sage.misc.prandom import random" declaration. That seems also that I can't type my function : if I try "cpdef CDF crand..", I get an error telling me that CDF is not a type. What are the consequences ? > > 2. If you want an even faster way, you need to use ComplexDoubleElement > internals: create the object with > ComplexDoubleElement.__new__(ComplexDoubleElement) and then manually set > the _complex attribute. > Thanks ! I'll have to lookup that. But I doubt that, in this specific case, it's worth the trouble : the overhead of calling Python's random()(twice !) probably dwarfes the return element creation. Unless I'm missing something... (or unless I'm using a C random generator, whose (correct) writing is something of a black art...). Thanks again ! -- Emmanuel Charpentier -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To post to this group, send email to sage-support@googlegroups.com. Visit this group at https://groups.google.com/group/sage-support. For more options, visit https://groups.google.com/d/optout.