On Mon, Apr 26, 2010 at 6:55 AM, William Stein <wst...@gmail.com> wrote: > On Mon, Apr 26, 2010 at 1:08 AM, Sergey Bochkanov > <sergey.bochka...@alglib.net> wrote: >> Hello, Case. >> >> You wrote 23 апреля 2010 г., 19:30:20: >> >>> (1) Python numeric values are assumed to be immutable. If not, they >>> cannot be used as dictionary keys. This forces all results to be new >>> objects, hence source/destination operands cannot overlap, etc. >> >> It is problem only when you want mpz/mpq to be value type. However, >> they can be reference types too. >> >> I know that it may be considered non-Pythonic, but such approach is >> much more efficient. And I think that output from high performance >> library like GPM/MPIR will very rarely be used as dictionary key. >> >> What do you think about such data model - reference mpz/mpq types? > > +1 > > Sage contains a Cython-based wrapper for GMP/MPIR, which has nothing > to do with GMPY (i.e., it is separate code). The lack of support for > mutable operations in GMPY is a drawback for it is a library, since > nobody uses MPIR unless they seriously care about speed. > > In Sage we do not have any explicit methods that mutate integers. We > do have two underscore methods, though, _iadd_ and _imul_, which > mutate self, since it is necessary to have such things to write really > fast code, though of course one must be very careful when using them: > > sage: a = 2010 > sage: a._imul_(19) > sage: a > 38190 > > I noticed that in Sage these are sadly undocumented, so opened a > ticket: http://trac.sagemath.org/sage_trac/ticket/8766 > > >>> (2) ..... Anytime you accept a Python integer, you either need to >>> just convert it to an mpz or test if it will fit in the _si/_ui >>> range and call the appropriate function. (GMPY uses the later >>> approach.) >> >> Very serious problem. And what should we do if we have Python-long >> which doesn't fit into 32 bits? >> >> We can't transparently convert it into the mpz and call another >> function because: a) it is hard to implement such semantics, >> especially within automatic code generation framework, and b) >> sometimes xxx_ui functions have slight differences from their mpz/mpq >> counterparts. >> >> I think that the only thing possible is to raise an exception in such >> cases. But it may be non-Pythonic too... > > In Sage we (=mostly Gonzalo Tornaria) spent an enormous amount of time > writing two very efficient C functions, one to convert from mpz to > Python ints, and one to convert back. Yes, writing this code is a > lot of work. But no, the resulting code is not slow. Just because > something is hard doesn't mean "we can't do it". > If you want this code, I bet Gonzalo would be OK with letting you have > it under another license (it's GPL v2+ right now); it's not long, just > tricky to write. I'm using this code already (Thanks Gonzalo!). I normally use the PyLong_AsLongAndOverflow to check if a PyLong can be converted to a C-long. If it fails, it doesn't generate an exception, it just sets a variable. It is quicker than letting an exception occur. I provided a PyLong_AsLongLongAndOverflow back to Python and it will be added to Python 2.7 and 3.2. That will make support for Windows x64 a lot easier. > >> >>> (3) It wasn't any faster. :( >> >> What kind of tests you made? Have you tested it with relatively small >> integers (up to 128 bits) or with really large ones? > > GMP/MPIR blow native python ints out of the water for asymptotically > large input. Already with 4 words the difference starts to get > noticeable. > >> >> I think that low speed may be caused mostly by creation of new objects >> after each operation (1) and (to a lesser extent) by conversion >> penalty (2). > > Yes. > >> However, when you work with really large numbers >> (thousands of bits) MPIR should be significantly faster than Python >> native implementation of long. I've found mpmath benchmark at >> http://mpmath.googlecode.com/svn/bench/mpbench.html which confirms >> this opinion. > > +1 > >> >> >> >> -- >> With best regards, >> Sergey mailto:sergey.bochka...@alglib.net >> >> -- >> You received this message because you are subscribed to the Google Groups >> "mpir-devel" group. >> To post to this group, send email to mpir-de...@googlegroups.com. >> To unsubscribe from this group, send email to >> mpir-devel+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/mpir-devel?hl=en. >> >> > > > > -- > William Stein > Professor of Mathematics > University of Washington > http://wstein.org > > -- > You received this message because you are subscribed to the Google Groups > "mpir-devel" group. > To post to this group, send email to mpir-de...@googlegroups.com. > To unsubscribe from this group, send email to > mpir-devel+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/mpir-devel?hl=en. > >
casevh -- You received this message because you are subscribed to the Google Groups "mpir-devel" group. To post to this group, send email to mpir-de...@googlegroups.com. To unsubscribe from this group, send email to mpir-devel+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/mpir-devel?hl=en.