Найти - Пользователи
Полная версия: range() и xrange()
Начало » Python для экспертов » range() и xrange()
1 2
yo0hoo
Вопрос конечно чайниковский, но я действительно не могу понять в чем их разница.
slav0nic
в том что range() выделяет память и создаёт список (сообтветсвенно нехило засырается память), а xrange() возвращает xrange объект (простой итератор) при этом мамять юзается только под объект и по ходу обращения к нему - возвращается определённое значение.

ps: range() вроде работает быстрее, тк происходит простая выборка из памяти, xrange() же ест мало памяти, но работает медленнее тк постоянно генерирует возвращаемое значени, хотя эт не всегда так, ещё при xrange ты не получишь MemoryError

почитай ещё справку и рассылку, что-то вроде “range() vs xrange()”
j2a
Ничего подобного. 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>=-
j2a прав на 100 прОцентов.
xrange() ну никак не может быть медленней, хотя бы уже потому, что список в кеш процессора может и не влезть, а число счётчик - запросто. Более того, вот такой вариант может оказаться ещё быстрее:

i=0
while i<0:
i+1

Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
slivlen
-=<fantom>=-
j2a прав на 100 прОцентов.
xrange() ну никак не может быть медленней, хотя бы уже потому, что список в кеш процессора может и не влезть, а число счётчик - запросто. Более того, вот такой вариант может оказаться ещё быстрее:

i=0
while i<0:
i+1

Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
Насчет скорости не проверял, но for компилится в меньшее кол-во операций в байт-коде, чем аналогичный while .
Это легко можно проверить с помощью byteplay модуля. http://wiki.python.org/moin/ByteplayDoc
-=<fantom>=-
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
slivlen
-=<fantom>=-
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
Полностью, согласен на счет всего выше сказанного. Но про скорость я ничего не утверждал, просто привел интересный,на мой взгляд, факт. :)
o7412369815963
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
прикольну штуку найшов в 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
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)
>>>
Ну и какой в ней смысл?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB