문제

그 이유는 무엇?

도움이 되었습니까?

해결책

성능을 위해, 특히 광범위한 범위를 반복 할 때 xrange() 보통 더 좋습니다. 그러나 여전히 당신이 선호하는 이유가 몇 가지 있습니다. range():

  • Python 3에서 range() 무엇을합니다 xrange() 사용했고 xrange() 존재하지 않는다. Python 2와 Python 3에서 실행되는 코드를 작성하려면 사용할 수 없습니다. xrange().

  • range() 어떤 경우에는 실제로 더 빠를 수 있습니다. 동일한 시퀀스를 여러 번 반복하는 경우. xrange() 매번 정수 객체를 재구성해야하지만 range() 실제 정수 객체가 있습니다. (그러나 항상 기억 측면에서 더 나빠질 것입니다)

  • xrange() 실제 목록이 필요한 모든 경우에 사용할 수 없습니다. 예를 들어, 슬라이스 또는 목록 방법을 지원하지 않습니다.

편집] 방법을 언급하는 몇 개의 게시물이 있습니다. range() 2To3 도구로 업그레이드됩니다. 레코드의 경우 다음은 일부 샘플 사용에서 도구를 실행하는 출력입니다. 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)

보시다시피, 루프 또는 이해력을 사용하거나 이미 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 ()가 C INT보다 큰 숫자를 지원할 수 없으므로 Python의 내장 된 다량의 지원을 사용하여 범위를 갖고 싶다면 범위 ()를 사용해야합니다.

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() 객체 목록을 생성하는 대신 한 번에 하나의 객체 만 생성하기 때문에 더 효율적입니다. 100 개의 정수 대신, 모든 오버 헤드, 그리고 그것들을 넣을 목록 대신 한 번에 하나의 정수 만 있습니다. 더 빠른 세대, 더 나은 메모리 사용,보다 효율적인 코드.

특별히 무언가 목록이 필요하지 않으면 항상 호의적입니다. 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는 어쨌든이 모든 일을해야한다고 생각합니다 ...

책에 제공된 좋은 예 : 실용적인 파이썬 Magnus Lie Hetland

>>> zip(range(5), xrange(100000000))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

앞의 예에서 xrange 대신 범위를 사용하지 않는 것이 좋습니다. 처음 5 개의 숫자 만 필요하지만 범위는 모든 숫자를 계산하며 많은 시간이 걸릴 수 있습니다. Xrange의 경우 필요한 숫자 만 계산하기 때문에 문제가되지 않습니다.

예, @Brian의 답변을 읽습니다 : Python 3에서 Range ()는 어쨌든 생성기이며 xrange ()가 존재하지 않습니다.

다음과 같은 이유로 범위로 이동하십시오.

1) Xrange는 새로운 Python 버전으로 사라질 것입니다. 이것은 당신에게 미래의 호환성을 쉽게 제공합니다.

2) 범위는 Xrange와 관련된 효율성을 취합니다.

좋아, 여기 모든 사람들은 Xrange 대 범위의 트레이드 오프와 장점에 대해 다른 의견입니다. 그것들은 대부분 정확하고 Xrange는 반복자이며 범위를 살펴보고 실제 목록을 만듭니다. 대부분의 경우, 당신은 실제로 둘 사이의 차이를 알지 못할 것입니다. (범위와 함께 맵을 사용할 수는 있지만 xrange는 포함되지 않지만 더 많은 메모리를 사용합니다.)

그러나 집회가 듣고 싶어하는 것은 선호하는 선택이 xrange라는 것입니다. Python 3의 범위는 반복기이므로 코드 변환 도구 2To3은 XRange의 모든 사용을 범위로 올바르게 변환하며 범위 사용에 대한 오류 또는 경고를 버립니다. 향후 코드를 쉽게 변환하려면 목록을 원하는 경우 Xrange 만 사용하고 목록 (xrange)을 사용합니다. 올해 시카고의 Pycon에서 열린 Cpython Sprint에서 이것을 배웠습니다.

  • range(): range(1, 10) 목록을 1에서 10 숫자로 반환하고 메모리에서 전체 목록을 보유합니다.
  • xrange(): 처럼 range(), 그러나 목록을 반환하는 대신 주문형 범위에서 숫자를 생성하는 객체를 반환합니다. 루핑의 경우, 이것은보다 빠릅니다 range() 그리고 더 많은 메모리 효율성. xrange() 반복자와 같은 객체와 주문형 숫자를 생성합니다 (게으른 평가).
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() 매번 정수 객체를 재구성해야하지만 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, 그러나 당신이 제한된 하드웨어를 사용하지 않는 한, 그것에 대해 너무 걱정하지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top