在python中执行任意* real *代码块(不是字符串化的版本)

时间:2019-05-22 13:02:42

标签: python

如何在python 中执行随机代码块而又不求其字符串化。我很可能对 eval exec 感兴趣。

因此,用例将是提供代码块的计时-但不需要先将代码块转换为字符串的技巧:

def formatTimeDelta(td):
  return '%d.%d' %(td.total_seconds() , int(td.microseconds/1000))

def timeit(tag, block):
  def getNow(): return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

  startt = datetime.datetime.now()
  print('Starting %s at %s..' %(tag,getNow()))
  block  # Execute the code!
  duration = formatTimeDelta(datetime.datetime.now() - startt)
  print('Completed %s at %s with duration=%s secs' %(tag,getNow(), duration))

所以我们将使用类似的东西:

给出一个“随机”代码块

def waitsecs(nsecs):
   import time
   time.sleep(nsecs)
   print('I slept %d secs..' %nsecs)

timeit('wait five secs', (
   waitsecs(5)
))

我相信我过去曾经做过所有事情,但似乎无法将其挖掘出来。.

4 个答案:

答案 0 :(得分:3)

timeit.Timer正是这样做的。

from time import sleep
from timeit import Timer

print(Timer(lambda: sleep(5)).repeat(1, 1))
# [5.000540999999999]

repeat只是计时功能的一种方法,请阅读链接的文档以获取其他可用方法。

答案 1 :(得分:1)

我找到的最简单的方法是在ipython或Jupyter笔记本中使用magic command %timeit。您可以根据需要指定重复和循环次数:

$ ipython                                                                                                           

In [1]: import time

In [2]: %timeit -n1 -r1 time.sleep(5)
5 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

In [3]: %timeit [i**2 for i in range(10000)]
8.12 ms ± 14.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

您不需要任何lambda,任何已定义的函数或任何字符串化的代码。

答案 2 :(得分:0)

使用装饰器,例如: @timeit装饰器:

new BigDecimal(23.11)

在方法中添加装饰器:

23.1099999994315658113818187512921995859375

来自:reference variables in javascript files

答案 3 :(得分:0)

您可以将Callable发送到timeit.timeit()函数,但如果没有属性,则只能发送 。如果它具有任何属性,则应使用设置代码。

timeit.timeit()函数具有setup attribute。您可以在timeit Timer对象开始工作之前发送代码(但仍为字符串形式)以“评估”它。这是示例:

import timeit

s = """
import math

def waka(number):
    return math.sqrt(number)
"""

timeit.timeit('waka(100)', setup=s)

timeit.timeit()的工作方式:

  

使用给定的语句,设置代码和计时器函数创建一个Timer实例,并通过执行数字来运行其timeit()方法。可选的globals参数指定在其中执行代码的名称空间。