【问题标题】:which is better practice for python in this case ?iterator inside function or outside function在这种情况下,对于 python 来说,这是更好的做法 ?iterator inside function or outside function
【发布时间】:2012-08-29 02:24:22
【问题描述】:

如果我提到“状态机”这个词,大多数人都会选择状态机设计。所以我想简化这个案例以专注于这一点。

这里建议是一个文本流,它很长或者经常被带到当前阶段。

每次我处理序列中的单个字符并决定下一个状态是什么时。这里有两种解决方案:

textflow = iter(text)
endFlag = False
while True:
   process()
   if endFlag:break

那么处理方法是这样的

def process0():
    for x in textflow:
        do something
        if condition1:
           process = process1
           break
        elif cond2:
           process = process2
           break


def process1():
    for x in textflow:
        do something
        if cond0:
           process = process0
           break
        elif cond2:
           process = process2
           break
    ...

for x in text:
   process(x)

那么处理方法是这样的

def process0(x):
    do something
    if cond1:
      process = process1
    elif cond2:
      process = process2

def process1(x):
    do something
    if cond0:
       process = process0
    elif cond2:
       process = process2
....

在第一种解决方案中,每个流程方法都以自己的方式进行迭代,并结束流程,直到状态发生变化。其次,主循环进行迭代,每次都会调用进程。(可以使用map(),但由于每次都会更改进程,因此无济于事。)

状态变化是这样的:

0 1 2 1 0 2 1 0 1 2 0 1 2 0 ....

或者像这样:

0 0 0 0 0 ...many 0 .. 0 1 ...many 1 ... 1 2......2 1 ..... 1

更常见的情况是:

0 1 1 1 1 1 0 0 2 1 1 1 1 2 0 2 3 1 1 1 1 3 1 1 1 2 0 ....

我需要一位顾问来告诉我哪种解决方案更有效。

【问题讨论】:

  • 您的第一个示例中的意思是process(textflow) 吗?还是 process 从周围的作用域中获取的?
  • 我不确定我是否理解我们应该关注哪些优化。在每个版本中都有相同数量的函数调用,唯一的区别是一个从全局变量中读取值,另一个获取作为参数传入的变量之一。他们都改变了全局变量process,所以没有什么不同。我怀疑运行时间会相同。

标签: python function loops performance


【解决方案1】:

这主要取决于您要处理多少项目,因为函数调用很昂贵。如果您有大量项目,那么在函数中嵌入循环是更好的选择。如果它只会迭代几个项目,我通常会选择最清楚表达意图的那个。

【讨论】:

  • 几个是多少? 100 还是 1000?它不会每次都改变,但对于一个状态来说,它不会持续很长时间。
  • 我会说“大量项目”将从一百万开始。如果给定项目需要的工作量超过最低限度,则可能需要 100,000 个。但是,一般的规则是先写得尽可能清楚,然后再分析它并修复慢的部分。在您知道实际拖慢您的速度之前不要进行优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多