9

我正在调整一个应用程序,该应用程序大量使用生成器来生成结果以提供 web.py Web 界面。

到目前为止,我可以将对 for 循环的调用和产生输出的语句包装在一个函数中,并使用cProfile.run()or调用它runctx()。从概念上讲:

def output():
    for value in generator():
        print(value)

cProfile.run('output()')

在 web.py 中,我必须用以下方式包装它,因为我想在每个迭代步骤中立即从可能长时间运行的计算中生成输出yield

class index:
    def GET(self):
        for value in generator():
            yield make_pretty_html(value)

有没有办法像在第二个示例中一样使用第一个示例中的生成器的所有调用?

4

3 回答 3

7

我终于找到了解决方案。通过这里分析的返回值。

import cProfile
import pstats
import glob
import math

def gen():
    for i in range(1, 10):
        yield math.factorial(i)

class index(object):
    def GET(self):
        p = cProfile.Profile()

        it = gen()
        while True:
            try:
                nxt = p.runcall(next, it)
            except StopIteration:
                break
            print nxt

        p.print_stats()

index().GET()

我还可以通过文档合并多个这样的分析结果(一旦我开始给出唯一的文件名)并存储/分析它们的组合。

于 2010-09-10T20:39:08.847 回答
2

听起来您正试图在生成器上分析对“下一个”的每个调用?如果是这样,您可以将生成器包装在分析生成器中。像这样,被注释掉的部分会将结果发送到日志或数据库。

def iter_profiler(itr):
  itr = iter(itr)
  while True:
    try:
      start = time.time()
      value = itr.next()
      end = time.time()
    except StopIteration:
      break
    # do something with (end - stop) times here
    yield value

generator()然后,而不是像您使用的那样实例化您的生成器iter_profiler(generator())

于 2010-09-10T01:48:47.070 回答
0

您可以只使用 time.time() 来分析您感兴趣的部分吗?只需获取当前时间并从您上次进行测量的时间中减去。

于 2010-08-25T22:04:14.560 回答