2016-12-12 2 views
0

を使用し、このオブジェクトを外部プログラムに渡してから、Popenを使用して出力を収集しようとしています。私の希望は、ハードディスク上に実際のファイルを作成し、可能な限り多くのIOを避けるよりも早くなることでした。私が作成している一時ファイルのこのサイズは、KB程度の小さなもので、作業する一時ファイルの作成は、通常のファイルを読み書きに使用するよりも実際に遅いことがわかりました。私はここで欠けているトリックはありますか? NamedTemporaryFileを使用すると、何が起こっているのですか?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 

プロファイリングを少し行うと、ほぼすべての時間がtempオブジェクトの作成に費やされたように見えます。 tempfile.NamedTemporaryFile(delete=False)を使用すると、この例では8ms以上かかる

+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

関連する問題