[英]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.count
比count_regular
或counter_gen
更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.