вторник, 7 сентября 2010 г.

Python range vs xrange

В Python существуют две, аналогичные с виду фунцкции: range и xrange, которые часто используются в циклах for. Обе они имеют сходный синтаксис:
range(start,stop,step) или xeange(start,stop,range). Где start,stop и step соответственно: начальное, конечное значения и шаг. Однако, если range возвращает список значений (list), xrange возвращает объект, что более эффективно использует память и более производительно в циклах.

Вот пример скрипта, демонстрирующий разницу в производительности (для сравнения еще и цикл while):

#!/usr/bin/python

def test_range(rng):
    for i in range(rng): pass

def test_xrange(rng):
    for i in xrange(rng): pass

def test_while(rng):
    i=0
    while i<=rng:
        i=i+1

if __name__=='__main__':
    from timeit import Timer
    testing_range=(100,1000,10000,100000,1000000,4000000)
    print "%7s %10s %16s %16s"%('Size','Range','XRange','While')
    for rng in testing_range:
        t_range=Timer('test_range(%i)'%rng,'from __main__ import\ test_range').timeit(number=1)*1000000
        t_xrange=Timer('test_xrange(%i)'%rng,'from __main__ import\ test_xrange').timeit(number=1)*1000000
        t_while=Timer('test_while(%i)'%rng,'from __main__ import\ test_while').timeit(number=1)*1000000
        print "%7d\t %9.2f\t %9.2f\t %9.2f\t"%(rng,t_range,t_xrange,t_while)


И вот резальтат вывода:
 Size      Range           XRange            While
    100         17.17         10.97         20.98    
   1000         82.97         59.84        221.97    
  10000       1345.16        559.09       2100.94    
 100000       9470.94       5361.08      18620.01    
1000000     100019.93      57285.07     189877.99    
4000000     389897.11     237751.96     779174.09