mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	GH-120754: Disable buffering in Path.read_bytes (#122111)
`Path.read_bytes()` is used to read a whole file. buffering /
BufferedIO is focused around making small, possibly interleaved,
read/write efficient which doesn't add value in this case.
On my Mac, running the benchmark:
```python
import pyperf
from pathlib import Path
def read_all(all_paths):
    for p in all_paths:
        p.read_bytes()
def read_file(path_obj):
    path_obj.read_bytes()
all_rst = list(Path("Doc").glob("**/*.rst"))
all_py = list(Path(".").glob("**/*.py"))
assert all_rst, "Should have found rst files"
assert all_py, "Should have found python source files"
runner = pyperf.Runner()
runner.bench_func("read_file_small", read_file, Path("Doc/howto/clinic.rst"))
runner.bench_func("read_file_large", read_file, Path("Doc/c-api/typeobj.rst"))
```
before:
```python
.....................
read_file_small: Mean +- std dev: 6.80 us +- 0.07 us
.....................
read_file_large: Mean +- std dev: 10.8 us +- 0.2 us
````
after:
```python
.....................
read_file_small: Mean +- std dev: 5.67 us +- 0.05 us
.....................
read_file_large: Mean +- std dev: 9.77 us +- 0.52 us
```
			
			
This commit is contained in:
		
							parent
							
								
									8ef358dae1
								
							
						
					
					
						commit
						35d8ac7cd7
					
				
					 3 changed files with 3 additions and 2 deletions
				
			
		|  | @ -585,7 +585,7 @@ def read_bytes(self): | |||
|         """ | ||||
|         Open the file in bytes mode, read it, and close the file. | ||||
|         """ | ||||
|         with self.open(mode='rb') as f: | ||||
|         with self.open(mode='rb', buffering=0) as f: | ||||
|             return f.read() | ||||
| 
 | ||||
|     def read_text(self, encoding=None, errors=None, newline=None): | ||||
|  |  | |||
|  | @ -1464,7 +1464,7 @@ def stat(self, *, follow_symlinks=True): | |||
| 
 | ||||
|     def open(self, mode='r', buffering=-1, encoding=None, | ||||
|              errors=None, newline=None): | ||||
|         if buffering != -1: | ||||
|         if buffering != -1 and not (buffering == 0 and 'b' in mode): | ||||
|             raise NotImplementedError | ||||
|         path_obj = self.resolve() | ||||
|         path = str(path_obj) | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| ``Pathlib.read_bytes`` no longer opens the file in Python's buffered I/O mode. This reduces overheads as the code reads a file in whole leading to a modest speedup. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cody Maloney
						Cody Maloney