| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Simple benchmarks for the multiprocessing package | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
											  
											
												Merged revisions 67348,67355,67359,67362,67364-67365,67367-67368,67398,67423-67424,67432,67440-67441,67444-67445,67454-67455,67457-67458 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r67348 | benjamin.peterson | 2008-11-22 20:09:41 -0600 (Sat, 22 Nov 2008) | 1 line
  raise a better error
........
  r67355 | georg.brandl | 2008-11-23 13:17:25 -0600 (Sun, 23 Nov 2008) | 2 lines
  #4392: fix parameter name.
........
  r67359 | georg.brandl | 2008-11-23 15:57:30 -0600 (Sun, 23 Nov 2008) | 2 lines
  #4399: fix typo.
........
  r67362 | gregory.p.smith | 2008-11-23 18:41:43 -0600 (Sun, 23 Nov 2008) | 2 lines
  Document PY_SSIZE_T_CLEAN for PyArg_ParseTuple.
........
  r67364 | benjamin.peterson | 2008-11-23 19:16:29 -0600 (Sun, 23 Nov 2008) | 2 lines
  replace reference to debugger-hooks
........
  r67365 | benjamin.peterson | 2008-11-23 22:09:03 -0600 (Sun, 23 Nov 2008) | 1 line
  #4396 make the parser module correctly validate the with syntax
........
  r67367 | georg.brandl | 2008-11-24 10:16:07 -0600 (Mon, 24 Nov 2008) | 2 lines
  Fix typo.
........
  r67368 | georg.brandl | 2008-11-24 13:56:47 -0600 (Mon, 24 Nov 2008) | 2 lines
  #4404: make clear what "path" is.
........
  r67398 | benjamin.peterson | 2008-11-26 11:39:17 -0600 (Wed, 26 Nov 2008) | 1 line
  fix typo in sqlite3 docs
........
  r67423 | jesse.noller | 2008-11-28 12:59:35 -0600 (Fri, 28 Nov 2008) | 2 lines
  issue4238: bsd support for cpu_count
........
  r67424 | christian.heimes | 2008-11-28 13:33:33 -0600 (Fri, 28 Nov 2008) | 1 line
  Retain copyright of processing examples. This was requested by a Debian maintainer during packaging of the multiprocessing package for 2.4/2.5
........
  r67432 | benjamin.peterson | 2008-11-28 17:18:46 -0600 (Fri, 28 Nov 2008) | 1 line
  SVN format 9 is the same it seems
........
  r67440 | jeremy.hylton | 2008-11-28 17:42:59 -0600 (Fri, 28 Nov 2008) | 4 lines
  Move definition int sval into branch of ifdef where it is used.
  Otherwise, you get a warning about an undefined variable.
........
  r67441 | jeremy.hylton | 2008-11-28 18:09:16 -0600 (Fri, 28 Nov 2008) | 2 lines
  Reflow long lines.
........
  r67444 | amaury.forgeotdarc | 2008-11-28 20:03:32 -0600 (Fri, 28 Nov 2008) | 2 lines
  Fix a small typo in docstring
........
  r67445 | benjamin.peterson | 2008-11-29 21:07:33 -0600 (Sat, 29 Nov 2008) | 1 line
  StringIO.close() stops you from using the buffer, too
........
  r67454 | benjamin.peterson | 2008-11-30 08:43:23 -0600 (Sun, 30 Nov 2008) | 1 line
  note the version that works
........
  r67455 | martin.v.loewis | 2008-11-30 13:28:27 -0600 (Sun, 30 Nov 2008) | 1 line
  Issue #4365: Add crtassem.h constants to the msvcrt module.
........
  r67457 | christian.heimes | 2008-11-30 15:16:28 -0600 (Sun, 30 Nov 2008) | 1 line
  w# requires Py_ssize_t
........
  r67458 | benjamin.peterson | 2008-11-30 15:46:16 -0600 (Sun, 30 Nov 2008) | 1 line
  fix pyspecific extensions that were broken by Sphinx's grand renaming
........
											
										 
											2008-11-30 22:46:23 +00:00
										 |  |  | # Copyright (c) 2006-2008, R Oudkerk | 
					
						
							|  |  |  | # All rights reserved. | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-26 13:55:55 -07:00
										 |  |  | import time | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import multiprocessing | 
					
						
							|  |  |  | import threading | 
					
						
							|  |  |  | import queue | 
					
						
							|  |  |  | import gc | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if sys.platform == 'win32': | 
					
						
							|  |  |  |     _timer = time.clock | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     _timer = time.time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | delta = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### TEST_QUEUESPEED | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def queuespeed_func(q, c, iterations): | 
					
						
							|  |  |  |     a = '0' * 256 | 
					
						
							|  |  |  |     c.acquire() | 
					
						
							|  |  |  |     c.notify() | 
					
						
							|  |  |  |     c.release() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     for i in range(iterations): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |         q.put(a) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     q.put('STOP') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_queuespeed(Process, q, c): | 
					
						
							|  |  |  |     elapsed = 0 | 
					
						
							|  |  |  |     iterations = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while elapsed < delta: | 
					
						
							|  |  |  |         iterations *= 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = Process(target=queuespeed_func, args=(q, c, iterations)) | 
					
						
							|  |  |  |         c.acquire() | 
					
						
							|  |  |  |         p.start() | 
					
						
							|  |  |  |         c.wait() | 
					
						
							|  |  |  |         c.release() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         result = None | 
					
						
							|  |  |  |         t = _timer() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while result != 'STOP': | 
					
						
							|  |  |  |             result = q.get() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         elapsed = _timer() - t | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p.join() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print(iterations, 'objects passed through the queue in', elapsed, 'seconds') | 
					
						
							|  |  |  |     print('average number/sec:', iterations/elapsed) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### TEST_PIPESPEED | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def pipe_func(c, cond, iterations): | 
					
						
							|  |  |  |     a = '0' * 256 | 
					
						
							|  |  |  |     cond.acquire() | 
					
						
							|  |  |  |     cond.notify() | 
					
						
							|  |  |  |     cond.release() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     for i in range(iterations): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |         c.send(a) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     c.send('STOP') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pipespeed(): | 
					
						
							|  |  |  |     c, d = multiprocessing.Pipe() | 
					
						
							|  |  |  |     cond = multiprocessing.Condition() | 
					
						
							|  |  |  |     elapsed = 0 | 
					
						
							|  |  |  |     iterations = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while elapsed < delta: | 
					
						
							|  |  |  |         iterations *= 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = multiprocessing.Process(target=pipe_func, | 
					
						
							|  |  |  |                                     args=(d, cond, iterations)) | 
					
						
							|  |  |  |         cond.acquire() | 
					
						
							|  |  |  |         p.start() | 
					
						
							|  |  |  |         cond.wait() | 
					
						
							|  |  |  |         cond.release() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         result = None | 
					
						
							|  |  |  |         t = _timer() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while result != 'STOP': | 
					
						
							|  |  |  |             result = c.recv() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         elapsed = _timer() - t | 
					
						
							|  |  |  |         p.join() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print(iterations, 'objects passed through connection in',elapsed,'seconds') | 
					
						
							|  |  |  |     print('average number/sec:', iterations/elapsed) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### TEST_SEQSPEED | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_seqspeed(seq): | 
					
						
							|  |  |  |     elapsed = 0 | 
					
						
							|  |  |  |     iterations = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while elapsed < delta: | 
					
						
							|  |  |  |         iterations *= 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         t = _timer() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |         for i in range(iterations): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |             a = seq[5] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-26 13:55:55 -07:00
										 |  |  |         elapsed = _timer() - t | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print(iterations, 'iterations in', elapsed, 'seconds') | 
					
						
							|  |  |  |     print('average number/sec:', iterations/elapsed) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### TEST_LOCK | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_lockspeed(l): | 
					
						
							|  |  |  |     elapsed = 0 | 
					
						
							|  |  |  |     iterations = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while elapsed < delta: | 
					
						
							|  |  |  |         iterations *= 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         t = _timer() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |         for i in range(iterations): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |             l.acquire() | 
					
						
							|  |  |  |             l.release() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-26 13:55:55 -07:00
										 |  |  |         elapsed = _timer() - t | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print(iterations, 'iterations in', elapsed, 'seconds') | 
					
						
							|  |  |  |     print('average number/sec:', iterations/elapsed) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### TEST_CONDITION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def conditionspeed_func(c, N): | 
					
						
							|  |  |  |     c.acquire() | 
					
						
							|  |  |  |     c.notify() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     for i in range(N): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |         c.wait() | 
					
						
							|  |  |  |         c.notify() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     c.release() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_conditionspeed(Process, c): | 
					
						
							|  |  |  |     elapsed = 0 | 
					
						
							|  |  |  |     iterations = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while elapsed < delta: | 
					
						
							|  |  |  |         iterations *= 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         c.acquire() | 
					
						
							|  |  |  |         p = Process(target=conditionspeed_func, args=(c, iterations)) | 
					
						
							|  |  |  |         p.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         c.wait() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         t = _timer() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |         for i in range(iterations): | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |             c.notify() | 
					
						
							|  |  |  |             c.wait() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-26 13:55:55 -07:00
										 |  |  |         elapsed = _timer() - t | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         c.release() | 
					
						
							|  |  |  |         p.join() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print(iterations * 2, 'waits in', elapsed, 'seconds') | 
					
						
							|  |  |  |     print('average number/sec:', iterations * 2 / elapsed) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  |     manager = multiprocessing.Manager() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     gc.disable() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing Queue.Queue\n') | 
					
						
							|  |  |  |     test_queuespeed(threading.Thread, queue.Queue(), | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |                     threading.Condition()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing multiprocessing.Queue\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_queuespeed(multiprocessing.Process, multiprocessing.Queue(), | 
					
						
							|  |  |  |                     multiprocessing.Condition()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing Queue managed by server process\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_queuespeed(multiprocessing.Process, manager.Queue(), | 
					
						
							|  |  |  |                     manager.Condition()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing multiprocessing.Pipe\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_pipespeed() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print() | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing list\n') | 
					
						
							|  |  |  |     test_seqspeed(list(range(10))) | 
					
						
							|  |  |  |     print('\n\t######## testing list managed by server process\n') | 
					
						
							|  |  |  |     test_seqspeed(manager.list(list(range(10)))) | 
					
						
							|  |  |  |     print('\n\t######## testing Array("i", ..., lock=False)\n') | 
					
						
							|  |  |  |     test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=False)) | 
					
						
							|  |  |  |     print('\n\t######## testing Array("i", ..., lock=True)\n') | 
					
						
							|  |  |  |     test_seqspeed(multiprocessing.Array('i', list(range(10)), lock=True)) | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print() | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing threading.Lock\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_lockspeed(threading.Lock()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing threading.RLock\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_lockspeed(threading.RLock()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing multiprocessing.Lock\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_lockspeed(multiprocessing.Lock()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing multiprocessing.RLock\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_lockspeed(multiprocessing.RLock()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing lock managed by server process\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_lockspeed(manager.Lock()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing rlock managed by server process\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_lockspeed(manager.RLock()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print() | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing threading.Condition\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_conditionspeed(threading.Thread, threading.Condition()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing multiprocessing.Condition\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_conditionspeed(multiprocessing.Process, multiprocessing.Condition()) | 
					
						
							| 
									
										
										
										
											2008-11-28 11:23:26 +00:00
										 |  |  |     print('\n\t######## testing condition managed by a server process\n') | 
					
						
							| 
									
										
										
										
											2008-06-11 16:44:04 +00:00
										 |  |  |     test_conditionspeed(multiprocessing.Process, manager.Condition()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     gc.enable() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     multiprocessing.freeze_support() | 
					
						
							|  |  |  |     test() |