항상 range()보다 xrange()를 선호합니까?
왜 그런가요? 혹은 왜 그렇지 않은가요?
위해서 을 할 는 '반복', '반복', '반복', '반복', '반복',xrange()
보통 더 낫습니다. 여러분이 더 선호할 수 몇 이 있습니다.range()
:
3에서는 python 3의
range()
일입니까?xrange()
에는 그랬고, 옛날에는 그랬다.xrange()
을 사용하다Python 2와 Python 3 둘 다에서 실행할 코드를 작성하려면xrange()
.range()
같은 시퀀스에 걸쳐 여러 번 반복하는 경우 등 경우에 따라 실제로 더 빠를 수 있습니다.xrange()
오브젝트를, integer 해야 합니다.range()
(기억력에서는 나빠진다).xrange()
실제 목록이 필요한 모든 경우에 사용할 수 있는 것은 아닙니다.예를 들어 슬라이스 또는 목록 메서드는 지원하지 않습니다.
[편집] 지금 댓글에 몇 개 올라오고 있는데range()
2에서 3으로 하다.이 를 사용한 range()
★★★★★★★★★★★★★★★★★」xrange()
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@
for x in range(20):
- a=range(20)
+ a=list(range(20))
b=list(range(20))
c=[x for x in range(20)]
d=(x for x in range(20))
- e=xrange(20)
+ e=range(20)
보시는 바와 같이 for loop 또는 comprehence에서 사용되는 경우 또는 이미 list()로 둘러싸인 경우 범위는 변경되지 않습니다.
아니요, 둘 다 용도가 있습니다.
xrange()
메모리를 절약할 수 있습니다.
for x in xrange(1, one_zillion):
대신:
for x in range(1, one_zillion):
「」를 해 주세요.range()
자자목면
multiples_of_seven = range(7,100,7)
print "Multiples of seven < 100: ", multiples_of_seven
너는 좋아해야 한다range()
에 걸쳐서xrange()
필요한 경우에만 사용할 수 있습니다.를 들어, 에서 .range()
를 하고 때 를 누릅니다 또는 인덱싱의 , 「」는 「」는 「」를 참조해 주세요.xrange()
정상적으로 동작합니다(통상은 훨씬 효율적입니다).라는 점이 있다.range()
xrange()
매우 작은 리스트의 경우입니다만, 사용의 하드웨어나 그 외의 상세한 것에 따라서는, 손익분기점은 1 또는 2의 길이일 가능성이 있습니다.걱정할 필요는 없습니다.xrange()
.
한 입니다.xrange()
큰수 Python의 하여 범위를 하려면 Cints를 사용해야 .따라서 Python의 내장 수 지원을 사용하여 범위를 설정하려면range()
.
Python 2.7.3 (default, Jul 13 2012, 22:29:01)
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(123456787676676767676676,123456787676676767676679)
[123456787676676767676676L, 123456787676676767676677L, 123456787676676767676678L]
>>> xrange(123456787676676767676676,123456787676676767676679)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
Python 3에는 다음과 같은 문제가 없습니다.
Python 3.2.3 (default, Jul 14 2012, 01:01:48)
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(123456787676676767676676,123456787676676767676679)
range(123456787676676767676676, 123456787676676767676679)
xrange()
오브젝트 목록을 생성하는 대신 한번에1개의 오브젝트만 생성하기 때문에 효율적입니다.100개의 정수와 그 모든 오버헤드 및 그것들을 넣을 리스트가 아니라 한번에 1개의 정수만 가질 수 있습니다.고속 생성, 메모리 사용률 향상, 코드 효율 향상.
한, 저는 항상 가 필요 없는 한 가 좋습니다.xrange()
range()는 목록을 반환하고 xrange()는 xrange 개체를 반환합니다.
xrange()는 조금 더 빠르고 메모리 효율이 높습니다.하지만 이익은 그리 크지 않다.
리스트가 사용하는 여분의 메모리는 물론 낭비되는 것만이 아닙니다.리스트에는 더 많은 기능(슬라이스, 반복, 삽입 등)이 있습니다.정확한 차이는 설명서에서 확인할 수 있습니다.뼈있는 규칙은 없으니 필요한 것을 사용하세요.
Python 3.0은 아직 개발 중이지만 IIRC range()는 2.X의 xrange()와 매우 유사하며 list(range)를 사용하여 목록을 생성할 수 있습니다.
슬라이스와 인덱싱 기능을 갖춘 xrange 객체를 얻는 것은 그다지 어렵지 않다는 것을 말씀드리고 싶습니다.xrange와 같은 속도로 동작하는 코드를 작성했습니다(반복).
from __future__ import division
def read_xrange(xrange_object):
# returns the xrange object's start, stop, and step
start = xrange_object[0]
if len(xrange_object) > 1:
step = xrange_object[1] - xrange_object[0]
else:
step = 1
stop = xrange_object[-1] + step
return start, stop, step
class Xrange(object):
''' creates an xrange-like object that supports slicing and indexing.
ex: a = Xrange(20)
a.index(10)
will work
Also a[:5]
will return another Xrange object with the specified attributes
Also allows for the conversion from an existing xrange object
'''
def __init__(self, *inputs):
# allow inputs of xrange objects
if len(inputs) == 1:
test, = inputs
if type(test) == xrange:
self.xrange = test
self.start, self.stop, self.step = read_xrange(test)
return
# or create one from start, stop, step
self.start, self.step = 0, None
if len(inputs) == 1:
self.stop, = inputs
elif len(inputs) == 2:
self.start, self.stop = inputs
elif len(inputs) == 3:
self.start, self.stop, self.step = inputs
else:
raise ValueError(inputs)
self.xrange = xrange(self.start, self.stop, self.step)
def __iter__(self):
return iter(self.xrange)
def __getitem__(self, item):
if type(item) is int:
if item < 0:
item += len(self)
return self.xrange[item]
if type(item) is slice:
# get the indexes, and then convert to the number
start, stop, step = item.start, item.stop, item.step
start = start if start != None else 0 # convert start = None to start = 0
if start < 0:
start += start
start = self[start]
if start < 0: raise IndexError(item)
step = (self.step if self.step != None else 1) * (step if step != None else 1)
stop = stop if stop is not None else self.xrange[-1]
if stop < 0:
stop += stop
stop = self[stop]
stop = stop
if stop > self.stop:
raise IndexError
if start < self.start:
raise IndexError
return Xrange(start, stop, step)
def index(self, value):
error = ValueError('object.index({0}): {0} not in object'.format(value))
index = (value - self.start)/self.step
if index % 1 != 0:
raise error
index = int(index)
try:
self.xrange[index]
except (IndexError, TypeError):
raise error
return index
def __len__(self):
return len(self.xrange)
솔직히 말해서, 이 모든 문제는 좀 바보같고 xrange가 이 모든 것을 해야 한다고 생각해.
다음과 같은 이유로 범위를 사용합니다.
1) 새로운 Python 버전에서는 xrange가 사라집니다.이것에 의해, 장래의 호환성이 용이하게 됩니다.
2) range는 xrange와 관련된 효율성에 영향을 미칩니다.
책에서 제시된 좋은 예: 실용적인 Python By Magnus Lie Hetland
>>> zip(range(5), xrange(100000000))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
앞의 예에서는 xrange 대신 range를 사용하는 것을 권장하지 않습니다.처음 5개의 숫자만 있으면 range는 모든 숫자를 계산하기 때문에 시간이 많이 걸릴 수 있습니다.xrange에서는 필요한 숫자만 계산하기 때문에 문제가 되지 않습니다.
네, @Brian의 답변을 읽었습니다.python 3에서는 range()는 제너레이터이며 xrange()는 존재하지 않습니다.
좋습니다. xrange와 range의 장단점에 대해 모두 다른 의견을 가지고 있습니다.대부분 정확하고 xrange는 반복기이며 범위가 확대되어 실제 목록을 만듭니다.대부분의 경우 두 가지 차이점을 잘 알 수 없습니다.(범위는 맵을 사용할 수 있지만 xrange는 사용할 수 없지만 메모리를 더 많이 사용합니다.)
단, 당신이 듣고 싶은 것은 xrange를 선택하는 것이 바람직하다는 것입니다.Python 3의 range는 반복기이므로 코드 변환 툴 2 to 3은 xrange의 모든 사용을 range로 올바르게 변환하여 range 사용에 대한 오류 또는 경고를 발생시킵니다.나중에 코드를 쉽게 변환하려면 xrange만 사용하고 목록을 원하는 경우 list(xrange)를 사용합니다.나는 이것을 올해(2008) 시카고에서 열린 파이콘의 CPython 스프린트에서 배웠다.
range()
:range(1, 10)
1 ~ 10 의 번호의 리스트를 반환해, 리스트 전체를 메모리에 보존합니다.xrange()
: Likerange()
그러나 목록을 반환하는 대신 온디맨드 범위의 번호를 생성하는 개체를 반환합니다.경우, 은 의의opop, opopopopopopopop for for보다 약간 .range()
메모리 효율이 향상됩니다.xrange()
반복기와 같은 오브젝트를 생성하여 온 디맨드 방식으로 수치를 생성합니다(Lazy Evaluation).
In [1]: range(1,10)
Out[1]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [2]: xrange(10)
Out[2]: xrange(10)
In [3]: print xrange.__doc__
Out[3]: xrange([start,] stop[, step]) -> xrange object
range()
일을 xrange()
되었으며 Python 3이라는 용어는 .xrange()
파이썬 3번range()
는 같은 시퀀스를 여러 번 반복하는 경우에 실제로 고속이 될 수 있습니다. xrange()
오브젝트를, integer 해야 합니다.range()
을 사용법
한편, 「 」는, 「 」, 「 」의 사이에xrange
range
대부분의 경우 성능 차이는 거의 없습니다.의 작은 합니다.range
★★★xrange
:
import timeit
# Try various list sizes.
for list_len in [1, 10, 100, 1000, 10000, 100000, 1000000]:
# Time doing a range and an xrange.
rtime = timeit.timeit('a=0;\nfor n in range(%d): a += n'%list_len, number=1000)
xrtime = timeit.timeit('a=0;\nfor n in xrange(%d): a += n'%list_len, number=1000)
# Print the result
print "Loop list of len %d: range=%.4f, xrange=%.4f"%(list_len, rtime, xrtime)
, '보다 낫다'는 을 알 수 있습니다.xrange
속도는 빠르지만 땀 흘릴 정도는 아닙니다.
Loop list of len 1: range=0.0003, xrange=0.0003
Loop list of len 10: range=0.0013, xrange=0.0011
Loop list of len 100: range=0.0068, xrange=0.0034
Loop list of len 1000: range=0.0609, xrange=0.0438
Loop list of len 10000: range=0.5527, xrange=0.5266
Loop list of len 100000: range=10.1666, xrange=7.8481
Loop list of len 1000000: range=168.3425, xrange=155.8719
에 꼭 사용하세요.xrange
이 있는 너무
언급URL : https://stackoverflow.com/questions/135041/should-you-always-favor-xrange-over-range
'source' 카테고리의 다른 글
다음과 같이 SQL 쿼리에서 SQL 테이블과 목록 간의 공통 값 찾기 (0) | 2023.02.06 |
---|---|
Java Regex 스레드는 안전한가요? (0) | 2023.02.06 |
MySQL에 Python datetime.datetime 개체 삽입 (0) | 2023.02.06 |
"접속 실패:php 함수의 'root'@'localhost' 사용자(암호: YES 사용)에 대한 액세스가 거부되었습니다. (0) | 2023.02.06 |
ubuntu 12.04의 nodejs 대 노드 (0) | 2023.02.06 |