On Mar 7, 8:45 pm, William Stein <wst...@gmail.com> wrote:
> On Sun, Mar 7, 2010 at 5:06 PM, Gokhan Sever <gokhanse...@gmail.com> wrote:
> > Parallel Python is a separate module. IPython is the interactive
> > Python interpreter that comes with Sage. However to use the IPython
> > parallel features you need to install some additional packages. I am
> > not sure if you could get it work from within Sage. More recommended
> > way is to have an external installation.
>
> > I don't know about @parallel yet. Please do tell me and give an
> > example of its usage. I look at the Parallel Python examples and they
> > are all lengthy. multiprocessing provides much simpler solution at a
> > first sight.
>
> I wrote @parallel.   Type
>
>    sage: parallel?
>
> for some documentation and look at the source code in Sage.
> You just do
>
>   @parallel(4)
>   def f(n):
>       # do some computation
>
> then
>
>   for X in f([1..10]):
>      print X
>
> and 4 copies of X will run at once.
>
> The actual implementation is *very* simple compared to multiprocessing
> or Parallel Python.  It's about 2 pages of custom code I wrote from
> scratch just using pure Python and the fork system call (which is part
> of the os module).   However, it has special support for forking Sage
> itself -- there are a number of issues having to do with pexpect
> interfaces, etc., which @parallel takes care of, but multiprocessing
> or Parallel python wouldn't know about.
>
> Another nice (imho) thing about @parallel is that it fork's a new
> process for each evaluation of the function f.   This is good because
> (1) forking is cheap, (2) the entire *state* of your process is copied
> to the forked processes as is (e.g., you can have @parallel's inside
> of functions you define on the command line or notebook, etc.), (3) if
> the computation of f(n) leaks memory or segfaults, the calling program
> doesn't die.
>
> I use @parallel constantly for my research.
>
>  -- William

I see that @parallel provides a very quick solution for the problem
and it is also the easiest to use. However consider my comparison (I
am running on my local Sage v4.3.3 build):


from timeit import default_timer as clock

@parallel(2)
def f(n):
    return n**3 + n**2 + n

t1 = clock()
map(f, range(1000000))
t2 = clock()
print "Elapsed time:", t2-t1

#Elapsed time: 7.36224603653
#Without @parallel; Elapsed time: 4.58867001534

Seems like something wrong. Could that be due to the map usage?


from timeit import default_timer as clock

def f(x):
    return x**3 + x**2 + x

t1 = clock()
map(f, range(1000000))
t2 = clock()
print "Elapsed time using single process:", t2-t1

#Elapsed time using single process: 4.68043208122


from timeit import default_timer as clock
from multiprocessing import Pool

def f(x):
    return x**3 + x**2 + x

if __name__ == '__main__':
    t1 = clock()
    pool = Pool(processes=2)            # start 2 worker processes
    dummy = pool.map(f, range(1000000))
    t2 = clock()
    print "Elapsed time using two processes:", t2-t1

# Elapsed time using two processes: 3.65069890022

With mp module it gets faster and threading works correctly --more
processes more speed



-- 
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URL: http://www.sagemath.org

Reply via email to