2016-12-12 81 views
0

我試圖使用NamedTemporaryFile並將此對象傳遞給外部程序使用,然後使用Popen收集輸出。我希望這會比在硬盤上創建真實文件更快,並儘可能避免IO。我創建的臨時文件的大小很小,大約爲KB左右,我發現創建臨時文件的工作實際上比使用普通文件讀/寫要慢。我在這裏錯過了一個詭計嗎?當我使用NamedTemporaryFile時幕後發生了什麼?命名臨時文件速度不足

# Using named temp file 
with tempfile.NamedTemporaryFile(delete=False) as temp: # delete=False to keep a reference to the file for process calls 
    for idx, item in enumerate(r): 
     temp.write(">{}\n{}\n".format(idx, item[1])) 
>>> 8.435 ms 

# Using normal file io 
with open("test.fa", "w") as temp: 
    for idx, item in enumerate(r): 
     temp.write(">{}\n{}\n".format(idx, item[1])) 
>>> 0.506 ms 

#-------- 

# Read using temp file 
[i for i in open(name, "r")] 
>>> 1.167 ms 

[i for i in open("test.fa", "r")] 
>>> 0.765 ms 

做了一點分析似乎幾乎整個時間都花在創建臨時對象上。在此示例中使用tempfile.NamedTemporaryFile(delete=False)需要超過8毫秒

+0

也許檢查是爲了避免名稱衝突。 –

回答

2

儘管我對Python運行時效率不太瞭解,但我會嘗試回答您的問題。

在Python的代碼tempfile.py中鑽取,您可以找到關於可能需要一些時間的線索。 _mkstemp_inner函數可能會打開幾個文件併爲每個文件引發異常。您的目錄包含的臨時文件越多,獲得的文件名衝突越多,所需的時間就越長。嘗試清空你的臨時目錄。

def _mkstemp_inner(dir, pre, suf, flags): 
    """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" 

    names = _get_candidate_names() 

    for seq in range(TMP_MAX): 
     name = next(names) 
     file = _os.path.join(dir, pre + name + suf) 
     try: 
      fd = _os.open(file, flags, 0o600) 
      _set_cloexec(fd) 
      return (fd, _os.path.abspath(file)) 
     except OSError as e: 
      if e.errno == _errno.EEXIST: 
       continue # try again 
      raise 

    raise IOError(_errno.EEXIST, "No usable temporary file name found") 

希望有所幫助。

+0

謝謝,但手動設置路徑名稱沒有幫助 – kezzos