2017-07-03 6 views
1

のグローバル引数を使用:私は以下のクラスでtimeit.timeitを実行しようとしていますtimeit.timeit

from contextlib import suppress 
from pathlib import Path 
import subprocess 
from timeit import timeit 


    class BackupVolume(): 
     ''' 
     Backup a file system on a volume using tar 
     ''' 
     targetFile = "bd.tar.gz" 
     srcPath = Path("/BulkData") 
     excludes = ["--exclude=VirtualBox VMs/*", # Exclude all the VM stuff 
        "--exclude=*.tar*"]   # Exclude this tar file 

     @classmethod 
     def backupData(cls, targetPath="~"): # pylint: disable=invalid-name 
      ''' 
      Runs tar to backup the data in /BulkData so we can reorganize that 
      volume. Deletes any old copy of the backup repository. 

      Parameters: 
      :param str targetPath: Where the backup should be created. 
      ''' 

      # pylint: disable=invalid-name 
      tarFile\ 
       = Path(Path(targetPath/
         cls.targetFile).resolve()) 
      with suppress(FileNotFoundError): 
       tarFile.unlink() 
      timeit('subprocess.run(["tar", "-cf", tarFile.as_posix(),' 
        'cls.excludes[0], cls.excludes[1], cls.srcPath.as_posix()])', 
        number=1, globals=something) 

私が持っている問題は、はtimeit()の内側にそれがサブプロセスを解釈できないということです。私はグローバルの引数はtimeit()に役立つはずですが、私はどのようにモジュールの名前空間を指定するか分からないと思う。誰かが私にどのように表示できますか?

答えて

1

globals = globals()の場合はtimeitとなりますのでご相談ください。

説明

globals引数がコードを実行するには、名前空間を指定します。 subprocessモジュール(関数外、クラス外でも)をインポートするため、globals()を使用できます。そうすることで、現在のモジュールの辞書にアクセスできます。docsに詳細情報があります。

スーパー簡単な例この例では、私は3の異なるシナリオを公開します。

  1. 地元の人々に例に従う
  2. カスタム名前空間

コードにアクセスする必要があるグローバル

  • にアクセスする必要があります:あなたはその何かをタイミングperformance_glob

    import subprocess 
    from timeit import timeit 
    import math 
    
    
    class ExampleClass(): 
    
        def performance_glob(self): 
         return timeit("subprocess.run('ls')", number = 1, globals = globals()) 
    
        def performance_loc(self): 
         a = 69 
         b = 42 
         return timeit("a * b", number = 1, globals = locals()) 
    
        def performance_mix(self): 
         a = 69 
         return timeit("math.sqrt(a)", number = 1, globals = {'math': globals().get('math'), 'a': locals().get('a')}) 
    
    1. をグローバルインポートが必要、モジュールsubprocess。あなたはグローバル名前空間を通過しない場合は、ローカル値performance_locはtimeit実行abウォンのために必要な変数に依存する関数にglobals()を渡す場合は、逆にこのNameError: name 'subprocess' is not defined
    2. のようなエラーメッセージが表示されます範囲に含まれていない。それであなたが使うことができるのですlocals()
    3. 最後のものは、関数にローカル変数と一般的なインポートの両方が必要な一般的なシナリオです。パラメータglobalsを辞書として指定できることを覚えている場合は、必要なキーを入力するだけで済みます。カスタマイズすることができます。
  • 関連する問題