2016-11-27 9 views
0
import time 
import logging 
from functools import reduce 

logging.basicConfig(filename='debug.log', level=logging.DEBUG) 



def read_large_file(file_object): 
    """Uses a generator to read a large file lazily""" 

    while True: 
     data = file_object.readline() 
     if not data: 
      break 
     yield data 


def process_file_1(file_path): 
    """Opens a large file and reads it in""" 

    try: 
     with open(file_path) as fp: 
      for line in read_large_file(fp): 
       logging.debug(line) 
       pass 

    except(IOError, OSError): 
     print('Error Opening or Processing file') 


    def process_file_2(file_path): 
     """Opens a large file and reads it in""" 

     try: 
      with open(path) as file_handler: 
       while True: 
        logging.debug(next(file_handler)) 
     except (IOError, OSError): 
      print("Error opening/processing file") 
     except StopIteration: 
      pass 


    if __name__ == "__main__": 
     path = "TB_data_dictionary_2016-04-15.csv" 

     l1 = [] 
     for i in range(1,10): 
      start = time.clock() 
      process_file_1(path) 
      end = time.clock() 
      diff = (end - start) 
      l1.append(diff) 

     avg = reduce(lambda x, y: x + y, l1)/len(l1) 
     print('processing time (with generators) {}'.format(avg)) 


     l2 = [] 
     for i in range(1,10): 
      start = time.clock() 
      process_file_2(path) 
      end = time.clock() 
      diff = (end - start) 
      l2.append(diff) 

     avg = reduce(lambda x, y: x + y, l2)/len(l2) 
     print('processing time (with iterators) {}'.format(avg)) 

出力:私はそれがgeneratorsを使用してiteratorsで読み込む大きなファイルを開くのにかかる時間を測定しようとしていた上記のプログラムでメモリ使用量プログラムの

C:\Python34\python.exe C:/pypen/data_structures/generators/generators1.py 
processing time (with generators) 0.028033358176432314 
processing time (with iterators) 0.02699498330810426 

。ファイルはhereです。イテレーターでファイルを読み込む時間は、ジェネレーターでも同じです。

私は、関数process_file_1process_file_2で使用されるmemroyの量を測定すると、ジェネレータがイテレータより優れていると仮定しています。 Pythonで関数ごとのメモリ使用量を測定する方法はありますか?

+1

2つのテストの前に破棄して、オペレーティングシステムによるファイルのキャッシュが両方の実行に適用されることを確認してください。 – tdelaney

+0

@tdelaney - プログラムを少し更新しました – liv2hak

答えて

2

まず、パフォーマンスを測定するためのコードの1回の繰り返しを使用することは良い考えではありません。結果は、システムパフォーマンスの不具合(バックグラウンドプロセス、CPUのガベージコレクションなど)によって異なる場合があります。同じコードを複数回反復しているかどうかチェックする必要があります。

このモジュールは、Pythonコードの時間小さなビットに簡単な方法を提供する:コードのパフォーマンスを測定するため

は、timeitモジュールを使用します。それは、コマンドラインインタフェースと呼び出し可能なインタフェースの両方を備えています。実行時間を測定するための多くの一般的なトラップを回避します。あなたのコードのメモリ消費量をチェックするため

は、Memory Profiler使用:

これはメモリ消費量のライン・バイ・ラインの分析だけでなく、プロセスのメモリ消費量を監視するためのPythonモジュールですPythonプログラムの場合