mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	bpo-40313: speed up bytes.hex() (GH-19594)
Automerge-Triggered-By: @gpshead
This commit is contained in:
		
							parent
							
								
									bba760e9b6
								
							
						
					
					
						commit
						6a9e80a931
					
				
					 2 changed files with 50 additions and 12 deletions
				
			
		|  | @ -0,0 +1 @@ | ||||||
|  | Improve the performance of bytes.hex(). | ||||||
|  | @ -82,22 +82,59 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, | ||||||
| 
 | 
 | ||||||
|     /* Hexlify */ |     /* Hexlify */ | ||||||
|     Py_ssize_t i, j; |     Py_ssize_t i, j; | ||||||
|  |     unsigned char c; | ||||||
|  | 
 | ||||||
|  |     if (bytes_per_sep_group == 0) { | ||||||
|         for (i = j = 0; i < arglen; ++i) { |         for (i = j = 0; i < arglen; ++i) { | ||||||
|             assert((j + 1) < resultlen); |             assert((j + 1) < resultlen); | ||||||
|         unsigned char c; |             c = argbuf[i]; | ||||||
|         c = (argbuf[i] >> 4) & 0x0f; |             retbuf[j++] = Py_hexdigits[c >> 4]; | ||||||
|         retbuf[j++] = Py_hexdigits[c]; |             retbuf[j++] = Py_hexdigits[c & 0x0f]; | ||||||
|         c = argbuf[i] & 0x0f; |  | ||||||
|         retbuf[j++] = Py_hexdigits[c]; |  | ||||||
|         if (bytes_per_sep_group && i < arglen - 1) { |  | ||||||
|             Py_ssize_t anchor; |  | ||||||
|             anchor = (bytes_per_sep_group > 0) ? (arglen - 1 - i) : (i + 1); |  | ||||||
|             if (anchor % abs_bytes_per_sep == 0) { |  | ||||||
|                 retbuf[j++] = sep_char; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         } |         } | ||||||
|         assert(j == resultlen); |         assert(j == resultlen); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         /* The number of complete chunk+sep periods */ | ||||||
|  |         Py_ssize_t chunks = (arglen - 1) / abs_bytes_per_sep; | ||||||
|  |         Py_ssize_t chunk; | ||||||
|  |         unsigned int k; | ||||||
|  | 
 | ||||||
|  |         if (bytes_per_sep_group < 0) { | ||||||
|  |             i = j = 0; | ||||||
|  |             for (chunk = 0; chunk < chunks; chunk++) { | ||||||
|  |                 for (k = 0; k < abs_bytes_per_sep; k++) { | ||||||
|  |                     c = argbuf[i++]; | ||||||
|  |                     retbuf[j++] = Py_hexdigits[c >> 4]; | ||||||
|  |                     retbuf[j++] = Py_hexdigits[c & 0x0f]; | ||||||
|  |                 } | ||||||
|  |                 retbuf[j++] = sep_char; | ||||||
|  |             } | ||||||
|  |             while (i < arglen) { | ||||||
|  |                 c = argbuf[i++]; | ||||||
|  |                 retbuf[j++] = Py_hexdigits[c >> 4]; | ||||||
|  |                 retbuf[j++] = Py_hexdigits[c & 0x0f]; | ||||||
|  |             } | ||||||
|  |             assert(j == resultlen); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             i = arglen - 1; | ||||||
|  |             j = resultlen - 1; | ||||||
|  |             for (chunk = 0; chunk < chunks; chunk++) { | ||||||
|  |                 for (k = 0; k < abs_bytes_per_sep; k++) { | ||||||
|  |                     c = argbuf[i--]; | ||||||
|  |                     retbuf[j--] = Py_hexdigits[c & 0x0f]; | ||||||
|  |                     retbuf[j--] = Py_hexdigits[c >> 4]; | ||||||
|  |                 } | ||||||
|  |                 retbuf[j--] = sep_char; | ||||||
|  |             } | ||||||
|  |             while (i >= 0) { | ||||||
|  |                 c = argbuf[i--]; | ||||||
|  |                 retbuf[j--] = Py_hexdigits[c & 0x0f]; | ||||||
|  |                 retbuf[j--] = Py_hexdigits[c >> 4]; | ||||||
|  |             } | ||||||
|  |             assert(j == -1); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| #ifdef Py_DEBUG | #ifdef Py_DEBUG | ||||||
|     if (!return_bytes) { |     if (!return_bytes) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 sweeneyde
						sweeneyde