On Fri, Jun 20, 2008 at 10:25 AM, Antoine Pitrou <[EMAIL PROTECTED]>
wrote:

>
> Kevin Jacobs <jacobs <at> bioinformed.com> <bioinformed <at> gmail.com>
> writes:
> >
> > +1 on a C API for enabling and disabling GC.  I have several instances
> where
> I create a large number of objects non-cyclic objects where I see huge GC
> overhead (30+ seconds with gc enabled, 0.15 seconds when disabled).
>
> Could you try to post a stripped-down, self-contained example of such
> behaviour?



$ python -m timeit 'zip(*[range(1000000)]*5)'
10 loops, best of 3: 496 msec per loop

$ python -m timeit -s 'import gc; gc.enable()' 'zip(*[range(1000000)]*5)'
10 loops, best of 3: 2.93 sec per loop

Note that timeit cheats and disables GC by default.

Attached is a less stripped down script to demonstrate the super-linear
behavior for somewhat naively coded transpose operators.  The output is
listed below:

FUNCTION        ROWS         COLUMNS     GC ENABLED    GC DISABLED
--------------  -----------  ----------  ------------  ------------
transpose_comp            5           0        0.0000        0.0000
transpose_comp            5      250000        0.5535        0.3537
transpose_comp            5      500000        1.4359        0.6868
transpose_comp            5      750000        2.7148        1.0760
transpose_comp            5     1000000        3.8070        1.3936
transpose_comp            5     1250000        5.5184        1.7617
transpose_comp            5     1500000        7.8828        2.1308
transpose_comp            5     1750000        9.3279        2.5364
transpose_comp            5     2000000       11.8248        2.7399
transpose_comp            5     2250000       14.7436        3.1585
transpose_comp            5     2500000       18.4452        3.5818
transpose_comp            5     2750000       21.4856        3.8988
transpose_comp            5     3000000       24.4110        4.3148
transpose_zip             5           0        0.0000        0.0000
transpose_zip             5      250000        0.2537        0.0658
transpose_zip             5      500000        0.8380        0.1324
transpose_zip             5      750000        1.7507        0.1989
transpose_zip             5     1000000        2.6169        0.2648
transpose_zip             5     1250000        4.0760        0.3317
transpose_zip             5     1500000        5.8852        0.4145
transpose_zip             5     1750000        7.3925        0.5161
transpose_zip             5     2000000       10.0755        0.6708
transpose_zip             5     2250000       14.2698        0.7760
transpose_zip             5     2500000       16.7291        0.9022
transpose_zip             5     2750000       20.3833        1.0179
transpose_zip             5     3000000       24.5515        1.0971

Hope this helps,
-Kevin
import gc
import time

def transpose_comp(rows):
  return [ [ row[i] for row in rows ] for i in xrange(len(rows[0])) ]

def transpose_zip(rows):
  return zip(*rows)

def bench(func, rows, cols):
  gc.enable()
  gc.collect()

  data = [ range(cols) ]*rows

  t0 = time.time()

  func(data)

  t1 = time.time()
  gc.disable()

  func(data)

  t2 = time.time()
  gc.enable()

  return t1-t0,t2-t1

print 'FUNCTION        ROWS         COLUMNS     GC ENABLED    GC DISABLED '
print '--------------  -----------  ----------  ------------  ------------'

rows = 5
for func in [transpose_comp,transpose_zip]:
  for cols in range(0,3000001,250000):
    enabled,disabled = bench(func, rows, cols)
    print '%-15s  %10d  %10d  %12.4f  %12.4f' % \
               (func.func_name,rows,cols,enabled,disabled)
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to