mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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