我想基准itertools
针对生成器和列表解析的几种方法。这个想法是,我想通过从基本列表中过滤一些条目来构建迭代器。这个基准看起来有关吗?
这里是我想出了(编后接受的答案)代码:
from itertools import ifilter
import collections
import random
import os
from timeit import Timer
os.system('cls')
# define large arrays
listArrays = [xrange(100), xrange(1000), xrange(10000), xrange(100000)]
#Number of element to be filtered out
nb_elem = 100
# Number of times we run the test
nb_rep = 1000
def discard(it):
collections.deque(it, maxlen=0)
def testGenerator(arr, sample):
discard(x for x in sample if x in arr)
def testIterator(arr, sample):
discard(ifilter(sample.__contains__, arr))
def testList(arr, sample):
discard([x for x in sample if x in arr])
if __name__ == '__main__':
for arr in listArrays:
print 'Size of array: %s ' % len(arr)
print 'number of iterations %s' % nb_rep
sample = random.sample(arr, nb_elem)
t1 = Timer('testIterator(arr, sample)', 'from __main__ import testIterator, arr, sample')
tt1 = t1.timeit(number=nb_rep)
t2 = Timer('testList(arr, sample)', 'from __main__ import testList, arr, sample')
tt2 = t2.timeit(number=nb_rep)
t3 = Timer('testGenerator(arr, sample)', 'from __main__ import testGenerator, arr, sample')
tt3 = t3.timeit(number=nb_rep)
norm = min(tt1, tt2, tt3)
print 'maximum runtime %.6f' % max(tt1, tt2, tt3)
print 'normalized times:\n iterator: %.6f \n list: %.6f \n generator: %.6f' % \
(tt1/norm, tt2/norm, tt3/norm)
print '===========================================
===========”
而且我得到请注意结果经过编辑的版本是不一样的机器(因此可用于具有标准化的结果)上运行,并跑了一个32位的解释与Python 2.7.3:
Size of array: 100
number of iterations 1000
maximum runtime 0.125595
normalized times:
iterator: 1.000000
list: 1.260302
generator: 1.276030
======================================================
Size of array: 1000
number of iterations 1000
maximum runtime 1.740341
normalized times:
iterator: 1.466031
list: 1.010701
generator: 1.000000
======================================================
Size of array: 10000
number of iterations 1000
maximum runtime 17.033630
normalized times:
iterator: 1.441600
list: 1.000000
generator: 1.010979
======================================================
Size of array: 100000
number of iterations 1000
maximum runtime 169.677963
normalized times:
iterator: 1.455594
list: 1.000000
generator: 1.008846
======================================================
你能给出一些改进的意见和评论无论这个基准能否给出准确的结果?
我知道我的装饰器中的条件可能会偏差结果。我希望就此提出一些建议。
谢谢。
首先,由于['time'](http://docs.python.org/2/library/time.html)模块在文档中明确指出,您通常不希望使用'time.time ()'或'time.clock()'来进行性能测试。这就是['timeit'](http://docs.python.org/2/library/timeit.html)模块的用途。 (另外,你的代码中有一半以上是试图再现'timeit'的作用,当然除了'timeit'的方式没有经过严格的测试。) – abarnert 2013-04-05 21:33:07