Форум сайта python.su
Вопрос конечно чайниковский, но я действительно не могу понять в чем их разница.
Офлайн
в том что range() выделяет память и создаёт список (сообтветсвенно нехило засырается память), а xrange() возвращает xrange объект (простой итератор) при этом мамять юзается только под объект и по ходу обращения к нему - возвращается определённое значение.
ps: range() вроде работает быстрее, тк происходит простая выборка из памяти, xrange() же ест мало памяти, но работает медленнее тк постоянно генерирует возвращаемое значени, хотя эт не всегда так, ещё при xrange ты не получишь MemoryError
почитай ещё справку и рассылку, что-то вроде “range() vs xrange()”
Офлайн
Ничего подобного. xrange быстрей.
Что на малых объемах:
j2a@moby:~$ python2.4 -m timeit -c 'for x in range(100): pass'
100000 loops, best of 3: 15.3 usec per loop
j2a@moby:~$ python2.4 -m timeit -c 'for x in xrange(100): pass'
100000 loops, best of 3: 11.7 usec per loop
j2a@moby:~$ python2.4 -m timeit -c 'for x in range(100000): pass'
100 loops, best of 3: 19.4 msec per loop
j2a@moby:~$ python2.4 -m timeit -c 'for x in xrange(100000): pass'
100 loops, best of 3: 11.6 msec per loop
Офлайн
j2a прав на 100 прОцентов.
xrange() ну никак не может быть медленней, хотя бы уже потому, что список в кеш процессора может и не влезть, а число счётчик - запросто. Более того, вот такой вариант может оказаться ещё быстрее:
i=0
while i<0:
i+1
Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
Офлайн
-=<fantom>=-Насчет скорости не проверял, но for компилится в меньшее кол-во операций в байт-коде, чем аналогичный while .
j2a прав на 100 прОцентов.
xrange() ну никак не может быть медленней, хотя бы уже потому, что список в кеш процессора может и не влезть, а число счётчик - запросто. Более того, вот такой вариант может оказаться ещё быстрее:
i=0
while i<0:
i+1
Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
Офлайн
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
Офлайн
-=<fantom>=-Полностью, согласен на счет всего выше сказанного. Но про скорость я ничего не утверждал, просто привел интересный,на мой взгляд, факт. :)
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
Офлайн
3 года прошло, новые результаты:
xrange по скорости всех делает
while: 1.18187536042
xrange: 0.436814056431
range: 0.71887615673
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
size = 10000000
a = time.clock()
i=0
while i<size:
i+=1
b = time.clock()
print 'while:',b-a
for i in xrange(size):
pass
c = time.clock()
print 'xrange:',c-b
for i in range(size):
pass
d = time.clock()
print 'range:',d-c
Офлайн
прикольну штуку найшов в xrange:
>>> from timeit import Timer
>>> t1 = Timer('len(list(xrange(20000)))'); t2 = Timer('iter(xrange(20000)).__length_hint__()')
>>> t1.timeit(3000), t2.timeit(3000)
(1.5572329723470375, 0.0022494479046599736)
>>>
Отредактировано (Авг. 30, 2009 13:59:45)
Офлайн
crchemistНу и какой в ней смысл?
прикольну штуку найшов в xrange:>>> from timeit import Timer
>>> t1 = Timer('len(list(xrange(20000)))'); t2 = Timer('iter(xrange(20000)).__length_hint__()')
>>> t1.timeit(3000), t2.timeit(3000)
(1.5572329723470375, 0.0022494479046599736)
>>>
Офлайн