python性能 - 函数与生成器函数

时间:2013-06-01 09:05:12

标签: python performance

我想知道哪一个在性能方面更好:一个带有状态的“常规”python函数,或者一个生成器。与similar questions不同,我使用最简化的函数来隔离问题:

常规功能:

 >>> def counter_reg():
         if not hasattr(count_regular,"c"):
             count_regular.c = -1
         count_regular.c +=1
         return count_regular.c

生成器功能:

>>> def counter_gen():
    c = 0
    while True:
        yield c
        c += 1

>>> counter = counter_gen()
>>> counter = counter.next

在这两种情况下,调用counter()counter_reg()都会产生相同的输出。

哪一个在性能方面更好? 谢谢,

1 个答案:

答案 0 :(得分:4)

以下是如何使用timeit module

对Python函数进行基准测试的示例

<强> test.py:

import itertools as IT

def count_regular():
     if not hasattr(count_regular,"c"):
         count_regular.c = -1
     count_regular.c +=1
     return count_regular.c

def counter_gen():
    c = 0
    while True:
        yield c
        c += 1

def using_count_regular(N):
    return [count_regular() for i in range(N)]

def using_counter_gen(N):
    counter = counter_gen()
    return [next(counter) for i in range(N)]    

def using_itertools(N):
    count = IT.count()
    return [next(count) for i in range(N)]    

像这样运行python来计算函数的时间:

% python -mtimeit -s'import test as t' 't.using_count_regular(1000)'
1000 loops, best of 3: 336 usec per loop
% python -mtimeit -s'import test as t' 't.using_counter_gen(1000)'
10000 loops, best of 3: 172 usec per loop
% python -mtimeit -s'import test as t' 't.using_itertools(1000)'
10000 loops, best of 3: 105 usec per loop

要进行更全面的基准测试,请尝试N的不同值,但在这种情况下,我认为这不重要。

正如您所料,使用itertools.countcount_regularcounter_gen更快。