mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	patch #1493701: performance enhancements for struct module
This commit is contained in:
		
							parent
							
								
									7ccc95a315
								
							
						
					
					
						commit
						232f3c91f9
					
				
					 3 changed files with 1431 additions and 0 deletions
				
			
		
							
								
								
									
										76
									
								
								Lib/struct.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Lib/struct.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,76 @@ | ||||||
|  | """ | ||||||
|  | Functions to convert between Python values and C structs. | ||||||
|  | Python strings are used to hold the data representing the C struct | ||||||
|  | and also as format strings to describe the layout of data in the C struct. | ||||||
|  | 
 | ||||||
|  | The optional first format char indicates byte order, size and alignment: | ||||||
|  |  @: native order, size & alignment (default) | ||||||
|  |  =: native order, std. size & alignment | ||||||
|  |  <: little-endian, std. size & alignment | ||||||
|  |  >: big-endian, std. size & alignment | ||||||
|  |  !: same as > | ||||||
|  | 
 | ||||||
|  | The remaining chars indicate types of args and must match exactly; | ||||||
|  | these can be preceded by a decimal repeat count: | ||||||
|  |  x: pad byte (no data); c:char; b:signed byte; B:unsigned byte; | ||||||
|  |  h:short; H:unsigned short; i:int; I:unsigned int; | ||||||
|  |  l:long; L:unsigned long; f:float; d:double. | ||||||
|  | Special cases (preceding decimal count indicates length): | ||||||
|  |  s:string (array of char); p: pascal string (with count byte). | ||||||
|  | Special case (only available in native format): | ||||||
|  |  P:an integer type that is wide enough to hold a pointer. | ||||||
|  | Special case (not in native mode unless 'long long' in platform C): | ||||||
|  |  q:long long; Q:unsigned long long | ||||||
|  | Whitespace between formats is ignored. | ||||||
|  | 
 | ||||||
|  | The variable struct.error is an exception raised on errors. | ||||||
|  | """ | ||||||
|  | __version__ = '0.1' | ||||||
|  | 
 | ||||||
|  | from _struct import Struct, error | ||||||
|  | 
 | ||||||
|  | _MAXCACHE = 100 | ||||||
|  | _cache = {} | ||||||
|  | 
 | ||||||
|  | def _compile(fmt): | ||||||
|  |     # Internal: compile struct pattern | ||||||
|  |     if len(_cache) >= _MAXCACHE: | ||||||
|  |         _cache.clear() | ||||||
|  |     s = Struct(fmt) | ||||||
|  |     _cache[fmt] = s | ||||||
|  |     return s | ||||||
|  | 
 | ||||||
|  | def calcsize(fmt): | ||||||
|  |     """ | ||||||
|  |     Return size of C struct described by format string fmt. | ||||||
|  |     See struct.__doc__ for more on format strings. | ||||||
|  |     """ | ||||||
|  |     try: | ||||||
|  |         o = _cache[fmt] | ||||||
|  |     except KeyError: | ||||||
|  |         o = _compile(fmt) | ||||||
|  |     return o.size | ||||||
|  |      | ||||||
|  | def pack(fmt, *args): | ||||||
|  |     """ | ||||||
|  |     Return string containing values v1, v2, ... packed according to fmt. | ||||||
|  |     See struct.__doc__ for more on format strings. | ||||||
|  |     """ | ||||||
|  |     try: | ||||||
|  |         o = _cache[fmt] | ||||||
|  |     except KeyError: | ||||||
|  |         o = _compile(fmt) | ||||||
|  |     return o.pack(*args) | ||||||
|  | 
 | ||||||
|  | def unpack(fmt, s): | ||||||
|  |     """ | ||||||
|  |     Unpack the string, containing packed C structure data, according | ||||||
|  |     to fmt.  Requires len(string)==calcsize(fmt). | ||||||
|  |     See struct.__doc__ for more on format strings. | ||||||
|  |     """ | ||||||
|  |     try: | ||||||
|  |         o = _cache[fmt] | ||||||
|  |     except KeyError: | ||||||
|  |         o = _compile(fmt) | ||||||
|  |     return o.unpack(s) | ||||||
|  |      | ||||||
							
								
								
									
										1355
									
								
								Modules/_struct.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1355
									
								
								Modules/_struct.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Bob Ippolito
						Bob Ippolito