传递文件对象而不是文件名的开销?
Overhead of passing around a file object instead of file name?
我有一种方法可以根据输入检测应该打开的文件,打开文件,然后 returns 文件对象。
def find_and_open(search_term):
# ... logic to find file
return open(filename, 'r')
我喜欢这种方式,因为它向调用者隐藏了大部分实现。你给它你的标准,它吐出文件对象。如果您无论如何都要打开它,为什么还要考虑字符串路径呢?
然而,在其他 Python 项目中,我倾向于看到这样的方法 return 文件路径的字符串,而不是文件对象本身。然后在最后一分钟打开文件,read/edited,然后关闭。
我的问题是:
从性能的角度来看,传递文件对象是否会带来更多开销?我想无论它指向什么,引用都是引用,但也许解释器中发生了一些事情,使得字符串引用比文件引用更快地传递?
纯粹从 "Pythonic" 的角度来看,return 文件对象或字符串路径(然后尽可能晚地打开文件)是否更有意义?
- 性能不太可能成为问题。读取和写入磁盘比从 RAM 读取慢几个数量级,因此传递指针不太可能成为性能瓶颈。 1
- 来自python docs:
It is good practice to use the with
keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way. It is also much shorter than writing equivalent try
-finally
blocks ...
请注意,您可以使用 with
打开文件 和 通过嵌套函数或使用 yield
将文件对象传递给其他函数].尽管在大多数情况下我认为这比传递文件字符串更不符合 pythonic。
Simple is better than complex.
Flat is better than nested.
您可能还对 pathlib 感兴趣。
我有一种方法可以根据输入检测应该打开的文件,打开文件,然后 returns 文件对象。
def find_and_open(search_term):
# ... logic to find file
return open(filename, 'r')
我喜欢这种方式,因为它向调用者隐藏了大部分实现。你给它你的标准,它吐出文件对象。如果您无论如何都要打开它,为什么还要考虑字符串路径呢?
然而,在其他 Python 项目中,我倾向于看到这样的方法 return 文件路径的字符串,而不是文件对象本身。然后在最后一分钟打开文件,read/edited,然后关闭。
我的问题是:
从性能的角度来看,传递文件对象是否会带来更多开销?我想无论它指向什么,引用都是引用,但也许解释器中发生了一些事情,使得字符串引用比文件引用更快地传递?
纯粹从 "Pythonic" 的角度来看,return 文件对象或字符串路径(然后尽可能晚地打开文件)是否更有意义?
- 性能不太可能成为问题。读取和写入磁盘比从 RAM 读取慢几个数量级,因此传递指针不太可能成为性能瓶颈。 1
- 来自python docs:
It is good practice to use the
with
keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way. It is also much shorter than writing equivalenttry
-finally
blocks ...
请注意,您可以使用 with
打开文件 和 通过嵌套函数或使用 yield
将文件对象传递给其他函数].尽管在大多数情况下我认为这比传递文件字符串更不符合 pythonic。
Simple is better than complex. Flat is better than nested.
您可能还对 pathlib 感兴趣。