鱼C论坛

 找回密码
 立即注册
查看: 2356|回复: 2

[已解决]timeit的Timer类的问题

[复制链接]
发表于 2020-12-25 16:43:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看了别人的代码,如下:
from timeit import Timer
def t2():
    li=[]
    for i in range(10000):
        li+=[i]
timer2=Timer('t2()','from __main__ import t2')
print('+:',timer2.timeit(10000))
然后我自己写出来了这样:
from timeit import Timer

def t2():
    li = []
    for i in range(10000):
        li += [i]

timer2 = Timer(t2)
print('+:', timer2.timeit(1000))
别人的代码Timer里面是 't2()','from __main__ import t2'
我的只有一个 t2
我想知道这两者之间的区别
最佳答案
2020-12-26 11:19:00
timer2=Timer('t2()','from __main__ import t2')
timer2 = Timer(t2)

#查找了这个Timer的__init__
def __init__(self, stmt="pass", setup="pass", timer=default_timer,
             globals=None):

# 本来以为你在构造对象,没有按照str格式传入会报错 
# 但其实Timer 的作者也想到了这点
# 所以他在你传入参数时候加了判断

'''     if isinstance(stmt, str):
            # Check that the code can be compiled outside a function
            compile(stmtprefix + stmt, dummy_src_name, "exec")
            stmt = reindent(stmt, 8)
        elif callable(stmt):      #  callable(t2)函数用于检查一个t2是否是可调用的
            local_ns['_stmt'] = stmt
            init += ', _stmt=_stmt'
            stmt = '_stmt()'
        else:
            raise ValueError("stmt is neither a string nor callable")
'''
#你的构建的对象timer2 = Timer(t2)。传入的是t2
# 触发了如下判断 
#  callable(t2)函数用于检查一个t2是否是可调用的
#  callable(t2) 返回True
#  Timer自动使用另外的流程将 参数传达
#  也是就说 在构建timer2 = Timer(t2) ,你只要参数位置填对
#  Timer(t2)  Timer(‘t2()’)   都是可以的 
# 第二个位置你不填 会给默认值“pass”
#所以也是可以执行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-25 16:55:03 | 显示全部楼层
本帖最后由 qq1151985918 于 2020-12-25 17:01 编辑

本质上应该没没什么区别吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-26 11:19:00 | 显示全部楼层    本楼为最佳答案   
timer2=Timer('t2()','from __main__ import t2')
timer2 = Timer(t2)

#查找了这个Timer的__init__
def __init__(self, stmt="pass", setup="pass", timer=default_timer,
             globals=None):

# 本来以为你在构造对象,没有按照str格式传入会报错 
# 但其实Timer 的作者也想到了这点
# 所以他在你传入参数时候加了判断

'''     if isinstance(stmt, str):
            # Check that the code can be compiled outside a function
            compile(stmtprefix + stmt, dummy_src_name, "exec")
            stmt = reindent(stmt, 8)
        elif callable(stmt):      #  callable(t2)函数用于检查一个t2是否是可调用的
            local_ns['_stmt'] = stmt
            init += ', _stmt=_stmt'
            stmt = '_stmt()'
        else:
            raise ValueError("stmt is neither a string nor callable")
'''
#你的构建的对象timer2 = Timer(t2)。传入的是t2
# 触发了如下判断 
#  callable(t2)函数用于检查一个t2是否是可调用的
#  callable(t2) 返回True
#  Timer自动使用另外的流程将 参数传达
#  也是就说 在构建timer2 = Timer(t2) ,你只要参数位置填对
#  Timer(t2)  Timer(‘t2()’)   都是可以的 
# 第二个位置你不填 会给默认值“pass”
#所以也是可以执行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 00:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表