Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2006 11:29:43

yo0hoo
От:
Зарегистрирован: 2006-06-17
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

range() и xrange()

Вопрос конечно чайниковский, но я действительно не могу понять в чем их разница.



Офлайн

#2 Июль 1, 2006 14:02:55

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

range() и xrange()

в том что range() выделяет память и создаёт список (сообтветсвенно нехило засырается память), а xrange() возвращает xrange объект (простой итератор) при этом мамять юзается только под объект и по ходу обращения к нему - возвращается определённое значение.

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

почитай ещё справку и рассылку, что-то вроде “range() vs xrange()”

Офлайн

#3 Июль 3, 2006 14:38:44

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

range() и 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



Офлайн

#4 Авг. 12, 2006 10:55:15

-=<fantom>=-
От:
Зарегистрирован: 2006-08-12
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

range() и xrange()

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

i=0
while i<0:
i+1

Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.



Офлайн

#5 Авг. 15, 2006 17:08:39

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

range() и xrange()

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

i=0
while i<0:
i+1

Цикл for требует больше времени, как на синтаксический разбор, так и на само исполнение.
Могу быть не прав, но в том что это так пока больше, чтобы запускать профилировщик.
Насчет скорости не проверял, но for компилится в меньшее кол-во операций в байт-коде, чем аналогичный while .
Это легко можно проверить с помощью byteplay модуля. http://wiki.python.org/moin/ByteplayDoc



Офлайн

#6 Авг. 16, 2006 20:37:57

-=<fantom>=-
От:
Зарегистрирован: 2006-08-12
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

range() и xrange()

Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)



Офлайн

#7 Авг. 16, 2006 22:24:09

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

range() и xrange()

-=<fantom>=-
Хм. Не вижу прямой связи, между длиной байт-кода и скоростью.
Прошу вспомнить пресловутое выравнивание по параграфам в машинных кодах. ;)
Полностью, согласен на счет всего выше сказанного. Но про скорость я ничего не утверждал, просто привел интересный,на мой взгляд, факт. :)



Офлайн

#8 Авг. 30, 2009 12:03:58

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

range() и xrange()

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

Офлайн

#9 Авг. 30, 2009 13:53:40

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

range() и xrange()

прикольну штуку найшов в 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)

Офлайн

#10 Авг. 30, 2009 14:25:59

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

range() и xrange()

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)
>>>
Ну и какой в ней смысл?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version