yo0hoo
Июль 1, 2006 11:29:43
Вопрос конечно чайниковский, но я действительно не могу понять в чем их разница.
slav0nic
Июль 1, 2006 14:02:55
в том что range() выделяет память и создаёт список (сообтветсвенно нехило засырается память), а xrange() возвращает xrange объект (простой итератор) при этом мамять юзается только под объект и по ходу обращения к нему - возвращается определённое значение.
ps: range() вроде работает быстрее, тк происходит простая выборка из памяти, xrange() же ест мало памяти, но работает медленнее тк постоянно генерирует возвращаемое значени, хотя эт не всегда так, ещё при xrange ты не получишь MemoryError
почитай ещё справку и рассылку, что-то вроде “range() vs xrange()”
j2a
Июль 3, 2006 14:38:44
Ничего подобного. 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
-=<fantom>=-
Авг. 12, 2006 10:55:15
j2a прав на 100 прОцентов.
xrange() ну никак не может быть медленней, хотя бы уже потому, что список в кеш процессора может и не влезть, а число счётчик - запросто. Более того, вот такой вариант может оказаться ещё быстрее:
i=0
while i<0:
i+1
Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
slivlen
Авг. 15, 2006 17:08:39
-=<fantom>=-
j2a прав на 100 прОцентов.
xrange() ну никак не может быть медленней, хотя бы уже потому, что список в кеш процессора может и не влезть, а число счётчик - запросто. Более того, вот такой вариант может оказаться ещё быстрее:
i=0
while i<0:
i+1
Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
Насчет скорости не проверял, но for компилится в меньшее кол-во операций в байт-коде, чем аналогичный while .
Это легко можно проверить с помощью byteplay модуля.
http://wiki.python.org/moin/ByteplayDoc
-=<fantom>=-
Авг. 16, 2006 20:37:57
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
slivlen
Авг. 16, 2006 22:24:09
-=<fantom>=-
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
Полностью, согласен на счет всего выше сказанного. Но про скорость я ничего не утверждал, просто привел интересный,на мой взгляд, факт. :)
o7412369815963
Авг. 30, 2009 12:03:58
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
crchemist
Авг. 30, 2009 13:53:40
прикольну штуку найшов в 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)
>>>
PooH
Авг. 30, 2009 14:25:59
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)
>>>
Ну и какой в ней смысл?