2013-02-14 4 views
4

나는 파이썬 2.x에서 range의 단점을 알고있다. (큰 범위에서는 비효율적 인리스트를 만든다.) 더 빠른 iterator counterpart이다. xrange. 그러나 Python 3.x에서는 range이 반복자이고 xrange은 삭제됩니다. 파이썬 2.x와 파이썬 3.x로 작성된이 두 개의 루프를 코드를 이식 할 수 있고 반복자를 사용할 수 있도록 작성하는 방법이 있습니까?파이썬 2.x와 파이썬 3.x를위한 portable, memory 효율적인 range()

# Python 2.x 
for i in xrange(a_lot): 
    use_i_in_someway(i) 

# Python 3.x 
for i in range(a_lot): 
    use_i_in_someway(i) 

나는 하나

if(platform.python_version_tuple()[0] == '3'): 
    xrange = range 

처럼 뭔가를 할 수 있다는 것을 알고 있지만, 나는 덜 해킹 틱이 아니라 고객의 주문에 따라 만들 수있는 무언가를 생각했다.

+0

관련 항목 : ['xrange (2 ** 100)'-> OverflowError : long int가 너무 커서 int로 변환 할 수 없습니다. (http://stackoverflow.com/questions/1482480/xrange2100-overflowerror-long-int-too -large-to-intre-to-int) – jfs

답변

2

하나의 대안 수정없이 파이썬 2와 3 모두에서 작동 코드베이스를 지원하기위한 것입니다 파이썬 2와 파이썬 (3) 사이의 차이를 통해 포장에 대한 간단한 유틸리티를 제공 Six 모듈을 사용하는 것입니다 다음 pymongo 소스를 참조 .

+0

좋은 제안, 그러나 다시 한 사용자 정의. – dmg

+0

@DJV - 그렇습니다.하지만 비 관습적인 것은 아닌 것 같아요. ( – root

+0

그것은 내가 원하는 것에 가장 근접한 대답입니다. 나는 며칠을 기다렸다가 더 나은 것이 없다면 받아 들일 것입니다. 오는 :) – dmg

1

xrange()에 대해 걱정할 필요가 없습니다. 2to3은 단순히 range()으로 변환합니다. 하지만 이식 가능한 코드를 작성하는 경우 좋은 아이디어는 예를 들어 compat.py 크로스 파이썬 기능을 가져 오는 파일입니다. 예 : https://github.com/mongodb/mongo-python-driver/blob/master/bson/py3compat.py

+1

그러나 이것은 프로그램이 Python 3에 최적화 된 버전으로 번역 될 것이라고 가정하고 DJV는 마치 두 프로그램에서 최적으로 실행되는 * 같은 * 프로그램을 유지하는 것처럼 들린다. – unwind

+0

질문은 2/3 변환없이 작동하는 코드를 묻습니다. – ManojGumber

+0

@unwind, 실제로는 큰 의도이지만 큰 프로젝트에서는 잘 작동하지 않습니다. Armin Ronacher의 기사를 읽기를 강력히 추천합니다 : http://lucumr.pocoo.org/2011/12/7/thoughts-on-python3/ –

관련 문제