簡體   English   中英

python性能-函數與生成器函數

[英]python performance- function vs generator functions

我想知道哪個在性能方面更好:帶狀態的“常規” python函數或生成器。 類似的問題不同,我使用最簡化的函數來隔離問題:

常規功能:

 >>> 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()都會產生相同的輸出。

在性能方面哪個更好? 謝謝,

這是一個如何使用timeit模塊對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更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM