需求:
# 提前声明一个上下文管理器
class timer:
...
# 调用这个管理器时实现如下效果:
import timer
with timer(100):
x = 12 * 12
# 计算一百次 x=12*12 计算消耗的时间,等同于 for range(100)
1
Contextualist 2021-11-09 10:09:24 +08:00
上下文管理器是(在字节码层面)被设计为必须将段落内容执行且只执行一次的。你这个需求可能得写个装饰器,然后把需要计时的片段放在一个被装饰的函数里。
|
2
SmiteChow 2021-11-09 10:12:47 +08:00
```
with timer(100) as runner: def inner(): x = 12 * 12 runner(inner) ``` |
3
LeeReamond OP @SmiteChow 这个感觉好丑陋啊
|
4
LeeReamond OP @SmiteChow 如果要多写一行 runner(inner)我感觉直接写 for _ in range(100)也一样了。。
|
5
SmiteChow 2021-11-09 10:41:21 +08:00
@LeeReamond 你需求不是指明了要用 context 做吗?你要写 for 就写,就别考虑 context 了。
|
6
Vegetable 2021-11-09 10:43:54 +08:00
这个应该是实现不了的,不过你知道你在重新实现 timeit 吗...
|
7
jaredyam 2021-11-09 10:47:13 +08:00
个人认为怎么都会多此一举。class 上下文管理主要靠 with 的传参,__enter__、__exit__方法控制,你这真要真么搞也就是在__enter__里加个 for range 。
|
8
jaredyam 2021-11-09 10:51:55 +08:00
不对,你这种需要应该不是用 class ,而是用装饰器,当然,也逃不掉 for range
|
9
LeeReamond OP @Vegetable 我知道,我觉得 timeit 不好用
|
10
vanton 2021-11-09 16:29:08 +08:00
timeit 很好用啊,自己包装下不就得了。
不晓得你怎么用的。 |
11
2i2Re2PLMaDnghL 2021-11-10 09:29:43 +08:00
上下文管理器没有回跳
不过理论上你可以在 #2 的基础上「约定」一个魔法名字, with timer(100): def __timed__(): x=12*12 然后在 timer.__exit__ 里面 inspect 出需要的作用域然后调用 100 次 __timed__ |