首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用timeit.timeit的全局参数

使用timeit.timeit的全局参数
EN

Stack Overflow用户
提问于 2017-07-03 17:11:55
回答 1查看 4.7K关注 0票数 10

我试图在以下类中运行timeit.timeit:

代码语言:javascript
复制
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()中,它不能解释子进程。我认为globals参数到timeit()应该会有所帮助,但我不知道如何指定模块命名空间。有人能告诉我怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-08 11:21:57

我认为在您的例子中,globals = globals()timeit调用中是可行的。

解释

globals参数指定要在其中执行代码的命名空间。由于您导入了subprocess模块(函数之外,甚至类之外),您可以使用globals()。在这样做时,您可以访问当前模块的字典,您可以找到更多的信息在文件中

超级简单示例

在本例中,我将公开3种不同的场景。

  1. 需要访问全局
  2. 需要访问本地
  3. 自定义命名空间

遵循以下示例的代码:

代码语言:javascript
复制
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': math, 'a': a})
  1. performance_glob中,您在计时需要全局导入的东西,即模块subprocess。如果不传递globals名称空间,就会得到类似于以下NameError: name 'subprocess' is not defined的错误消息
  2. 相反,如果将globals()传递给依赖于本地值的函数( performance_loc ),则时间执行ab所需的变量将不在作用域中。这就是为什么你可以使用locals()
  3. 最后一个场景是一个通用场景,您需要函数中的本地vars和一般导入。如果您记住可以将参数globals指定为字典,只需提供必要的键,就可以自定义它。
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44890932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档