【问题标题】:Overhead of passing around a file object instead of file name?传递文件对象而不是文件名的开销?
【发布时间】:2015-10-03 21:47:10
【问题描述】:

我有一个方法可以根据输入检测应该打开什么文件,打开文件,然后返回文件对象。

def find_and_open(search_term):
    # ... logic to find file
    return open(filename, 'r')

我喜欢这种方式,因为它对调用者隐藏了最多的实现。你给它你的标准,它会吐出文件对象。如果您仍然要打开它,为什么还要打扰字符串路径?

但是,在其他 Python 项目中,我倾向于看到这样的方法返回文件路径的字符串,而不是文件对象本身。然后在最后一分钟打开文件,读取/编辑并关闭文件。

我的问题是:

  • 从性能的角度来看,传递文件对象是否会带来更多开销?我想无论它指向什么引用都是一个引用,但也许解释器中发生了一些事情,使字符串引用比文件引用更快地传递?

  • 从纯粹“Pythonic”的角度来看,返回文件对象或字符串路径(然后尽可能晚地打开文件)是否更有意义?

【问题讨论】:

  • 您为什么不使用timeitprofile 模块并自己找出答案?
  • 我更喜欢返回字符串路径,并使用with open(...) as ...打开文件

标签: python coding-style


【解决方案1】:
  1. 性能不太可能成为问题。读取和写入磁盘比从 RAM 读取要慢几个数量级,因此传递指针不太可能成为性能瓶颈。 1
  2. 来自python docs

    在处理文件对象时,最好使用with 关键字。这样做的好处是文件在其套件完成后正确关闭,即使在途中引发异常也是如此。它也比编写等效的 try-finally 块要短得多...

请注意,您既可以使用with 打开文件也可以通过嵌套函数或使用yield 将文件对象传递给其他函数。尽管在大多数情况下,我认为这比传递文件字符串要少。

简单胜于复杂。 平面比嵌套好。

您可能还对pathlib 感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 2016-09-13
    • 2012-08-07
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多