왜 Python3에는 xrange 함수가 없습니까?
에 Python3를 Python3가 요.xrange
간단한 예:
Python2:
from time import time as t def count(): st = t() [x for x in xrange(10000000) if x%4 == 0] et = t() print et-st count()
Python3:
from time import time as t def xrange(x): return iter(range(x)) def count(): st = t() [x for x in xrange(10000000) if x%4 == 0] et = t() print (et-st) count()
결과는 각각 다음과 같습니다.
1.53888392448
3.215819835662842
왜런그 일일? 왜 i, i, i?xrange
제되????을 사용하다나처럼 초심자에게는 우리 모두가 어느 시점에 있었던 것처럼. 적절한PEP를 수가 없어요.'PEP'는요? 못 찾겠어요.
「」를한 퍼포먼스 측정의 일부timeit
, 「」를 사용해 주세요.time
.
먼저 Apple 2.7.2 64비트:
In [37]: %timeit collections.deque((x for x in xrange(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.05 s per loop
이제 python.org 3.3.0 64비트:
In [83]: %timeit collections.deque((x for x in range(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.32 s per loop
In [84]: %timeit collections.deque((x for x in xrange(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.31 s per loop
In [85]: %timeit collections.deque((x for x in iter(range(10000000)) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.33 s per loop
는 3.x로 있다고 합니다.range
보다 xrange
의 xrange
함수는 일도 로서 이 함수는 이 함수에 대한 입니다.)또한 이 함수는__iter__
콜 중 에서 어떤 이 일어나도 되지 않을 높지만.)
하지만 30%만 느려요.어떻게 작전 속도가 2배 느려졌지?32비트 Python에서 동일한 테스트를 반복하면 3.12와 비교하여 1.58이 나옵니다.이 경우에도 3.x가 64비트 퍼포먼스에 최적화되어 32비트에 악영향을 미치는 경우가 있다고 생각합니다.
하지만 그게 정말 중요한가요?3.3.0 64비트의 경우는, 이것을 확인해 주세요.
In [86]: %timeit [x for x in range(10000000) if x%4 == 0]
1 loops, best of 3: 3.65 s per loop
그래서, 그 빌딩은list
전체 반복보다 두 배 이상 더 오래 걸립니다.
' 2 더 을 소비한다'는에서는 3.의 'Python 2.6+'와 .range
의 2.x의 동일합니다.xrange
또한 10배의 크기라고 해도 불필요한 목록을 작성하는 것은 범위 반복이 할 수 있는 어떤 것보다도 약 10000000배의 문제가 됩니다.
그리고 명시적인 표현은요?for
"C" 내의 "C" 루프를 합니다.deque
In [87]: def consume(x):
....: for i in x:
....: pass
In [88]: %timeit consume(x for x in range(10000000) if x%4 == 0)
1 loops, best of 3: 1.85 s per loop
, 거의 것입니다.for
스테이트먼트range
.
범위 객체의 반복 최적화가 걱정된다면 잘못된 위치를 찾고 있는 것일 수 있습니다.
왜 그러냐고 요.xrange
같은 말을 몇 번이나 해도 제거가 되었습니다만, 다시 한 번 말씀드리겠습니다.되지 않았다: 은 제되지 to to to to to to to to to to to로 되었다.이름은range
2. 2.xrange
거된것것 것것것다다
은 3.3이라는 증거가 있습니다.range
는 2.x의 입니다.xrange
오브젝트(2.x 이외의 것)range
function): 소스 3.3 및 2.7. 변경 이력도 볼 수 있습니다(파일의 임의의 위치에 있는 문자열 "xrange"의 마지막 인스턴스를 대체한 변경과 링크되어 있습니다.
그런데 왜 더 느리죠?
음, 한 예로, 그들은 많은 새로운 기능들을 추가했습니다.또 다른 예로, 그들은 사소한 부작용을 가진 모든 종류의 변화를 (특히 내부적인 반복을) 시도했습니다.그리고 중요한 여러 사례를 극적으로 최적화하기 위해 많은 작업이 이루어졌습니다. 때로는 덜 중요한 사례를 다소 비관적으로 보더라도 말이죠.이 모든 것을 합치면, 난 놀랍지 않아.range
지금은 좀 느려요.입니다.이러한 성능 차이가 코드의 핫스팟인 실제 사용 사례는 없을 것입니다.
Python3의 범위는 Python2의 xrange입니다.그것에 대해 반복할 필요는 없다.Python3에서 실제 목록을 얻으려면list(range(...))
Python2와 Python3에 대응하고 싶은 경우는, 이것을 사용해 주세요.
try:
xrange
except NameError:
xrange = range
의 ★★★★★★3★range
의 Python 2와 합니다.xrange
왜냐하면 반복기가 다시 돌아갔기 때문입니다.xrange
함수는 이 를 수 있는 입니다.range
직접적으로.
시스템 속도가 느려지는 현상을 재현할 수 없습니다.테스트 방법은 다음과 같습니다.
2, Python 2 , ★★xrange
:
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)
18.631936646865853
3, Python 3 , ★★range
조금 더 빠릅니다.
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
17.31399508687869
의 ★★★★★★★ Python 3 ★★★★★★★★★의 Python 3를 최근 알게 되었습니다.range
등.type은 슬라이스 지원입니다.range(10,100,2)[5:25:5]
range(20, 60, 10)
!
python2 코드를 수정하는 방법 중 하나는 다음과 같습니다.
import sys
if sys.version_info >= (3, 0):
def xrange(*args, **kwargs):
return iter(range(*args, **kwargs))
Python 2의 xrange는 생성기이며 반복기를 구현하지만 range는 함수일 뿐입니다.Python3에서는 왜 xrange에서 떨어졌는지 알 수 없습니다.
comp:~$ Python 2.7.6 (기본값, 2015년 6월 22일, 17:58:13) [GCC 4.8.2] (Linux2 상)
>>> import timeit
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)
5.656799077987671
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=100)
5.579368829727173
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
21.54827117919922
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
22.014557123184204
timeit number=1 param일 경우:
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=1)
0.2245171070098877
>>> timeit.timeit("[x for x in xrange(1000000) if x%4]",number=1)
0.10750913619995117
comp:~$ python3 Python 3.4.3 (기본값, 2015년 10월 14일, 20:28:29) [GCC 4.8.4] (Linux)
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
9.113872020003328
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=100)
9.07014398300089
timeit number=1,2,3,4 param은 빠르고 선형적으로 작동합니다.
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=1)
0.09329321900440846
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=2)
0.18501482300052885
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=3)
0.2703447980020428
>>> timeit.timeit("[x for x in range(1000000) if x%4]",number=4)
0.36209142999723554
따라서 timeit.timeit[[x for x in range(x%4), number=1)와 같은 실행 중인 루프 사이클을 측정하면 python3은 충분히 빠르게 동작하지만 실제 코드에서 사용하는 것처럼 반복 루프에서는 python2 xrange()가 python3의 range()에 대해 속도에서 승리합니다.
언급URL : https://stackoverflow.com/questions/15014310/why-is-there-no-xrange-function-in-python3
'source' 카테고리의 다른 글
복합 인덱스는 언제 사용해야 합니까? (0) | 2022.11.14 |
---|---|
Spring Boot에 실행 가능한 jar에 사용할 메인클래스를 지시하려면 어떻게 해야 하나요? (0) | 2022.11.14 |
MySQL 지정된 두 개 이상의 값 중 최소/최대 값을 선택합니다. (0) | 2022.11.14 |
"WHERE column ="에 있는 MySQL에서 물음표의 중요성은 무엇입니까? (0) | 2022.11.14 |
Django QuerySet에서 SQL 가져오기 (0) | 2022.11.14 |