Python에서 임의의 정수 목록 만들기
테스트 목적으로 임의의 정수 목록을 만들고 싶습니다. 숫자의 분포는 중요하지 않습니다. 계산되는 유일한 것은 시간 입니다. 난수를 생성하는 것이 시간이 많이 걸리는 작업이라는 것을 알고 있지만 더 나은 방법이 있어야합니다.
내 현재 솔루션은 다음과 같습니다.
import random
import timeit
# Random lists from [0-999] interval
print [random.randint(0, 1000) for r in xrange(10)] # v1
print [random.choice([i for i in xrange(1000)]) for r in xrange(10)] # v2
# Measurement:
t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1
t2 = timeit.Timer('random.sample(range(1000), 10000)', 'import random') # v2
print t1.timeit(1000)/1000
print t2.timeit(1000)/1000
v2는 v1보다 빠르지 만 그렇게 대규모로 작동하지 않습니다. 다음과 같은 오류가 발생합니다.
ValueError : 모집단보다 큰 표본
해당 규모에서 작동하는 빠르고 효율적인 솔루션이 있습니까?
답변의 일부 결과
앤드류 : 0.000290962934494
니 블러 : 0.0058455221653
케니 TM : 0.00219276118279
NumPy가 와서보고 정복했습니다.
원하는 것이 무엇인지 완전히 명확하지는 않지만 numpy.random.randint를 사용 합니다 .
import numpy.random as nprnd
import timeit
t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1
### Change v2 so that it picks numbers in (0, 10000) and thus runs...
t2 = timeit.Timer('random.sample(range(10000), 10000)', 'import random') # v2
t3 = timeit.Timer('nprnd.randint(1000, size=10000)', 'import numpy.random as nprnd') # v3
print t1.timeit(1000)/1000
print t2.timeit(1000)/1000
print t3.timeit(1000)/1000
내 컴퓨터에 제공됩니다.
0.0233682730198
0.00781716918945
0.000147947072983
randint가 있습니다 매우 당신이 정말로 당신이로 나눌 수 1,000 0에서 그들을 원하는 경우 - random.sample 다른 (귀하의 경우 작동하도록 위해서는 나는 해설자 중 하나가 지적했듯이 만에 1,000을 변경했다 10).
그리고 당신이 어떤 분포를 얻고 있는지 정말로 신경 쓰지 않는다면, 당신은 당신의 문제를 잘 이해하지 못하거나, 무례하게 들리면 사과와 함께 임의의 숫자를 이해할 수 있습니다.
모든 임의의 메서드가 결국 호출 random.random()되므로 가장 좋은 방법은 직접 호출하는 것입니다.
[int(1000*random.random()) for i in xrange(10000)]
예를 들면
random.randint호출합니다random.randrange.random.randrange반환하기 전에 범위를 확인하는 많은 오버 헤드가 있습니다istart + istep*int(self.random() * n).
물론 NumPy는 훨씬 더 빠릅니다.
성능에 대한 귀하의 질문은 논쟁의 여지가 있습니다. 두 기능 모두 매우 빠릅니다. 코드의 속도는 당신이 무엇에 의해 결정됩니다 할 임의의 숫자.
그러나이 두 기능의 동작 차이를 이해하는 것이 중요합니다 . 하나는 대체로 무작위 샘플링을 수행하고 다른 하나는 대체없이 무작위 샘플링을 수행합니다.
첫째, 당신은 사용해야 randrange(0,1000)하거나 randint(0,999),하지 randint(0,1000). 의 상한값 randint이 포함됩니다.
효율적으로 randint는 단순히을 randrange호출 하는 래퍼 random이므로 random. 또한 xrange의 인수로 사용 sample하지 마십시오 range.
당신은 사용할 수 있습니다
[a for a in sample(xrange(1000),1000) for _ in range(10000/1000)]
sample10 번을 사용하여 범위에서 10,000 개의 숫자를 생성 합니다.
(Of course this won't beat NumPy.)
$ python2.7 -m timeit -s 'from random import randrange' '[randrange(1000) for _ in xrange(10000)]'
10 loops, best of 3: 26.1 msec per loop
$ python2.7 -m timeit -s 'from random import sample' '[a%1000 for a in sample(xrange(10000),10000)]'
100 loops, best of 3: 18.4 msec per loop
$ python2.7 -m timeit -s 'from random import random' '[int(1000*random()) for _ in xrange(10000)]'
100 loops, best of 3: 9.24 msec per loop
$ python2.7 -m timeit -s 'from random import sample' '[a for a in sample(xrange(1000),1000) for _ in range(10000/1000)]'
100 loops, best of 3: 3.79 msec per loop
$ python2.7 -m timeit -s 'from random import shuffle
> def samplefull(x):
> a = range(x)
> shuffle(a)
> return a' '[a for a in samplefull(1000) for _ in xrange(10000/1000)]'
100 loops, best of 3: 3.16 msec per loop
$ python2.7 -m timeit -s 'from numpy.random import randint' 'randint(1000, size=10000)'
1000 loops, best of 3: 363 usec per loop
But since you don't care about the distribution of numbers, why not just use:
range(1000)*(10000/1000)
?
참고URL : https://stackoverflow.com/questions/4172131/create-random-list-of-integers-in-python
'Nice programing' 카테고리의 다른 글
| Thrift, 프로토콜 버퍼, JSON, EJB 등의 성능 비교? (0) | 2020.11.08 |
|---|---|
| mine-full 및 theirs-full 명령의 목적 (0) | 2020.11.08 |
| 파일> 새 MVC 3 프로젝트의 새로운 "HTML5 의미 마크 업 사용"옵션 (0) | 2020.11.08 |
| grep 및 sed를 사용하여 문자열 찾기 및 바꾸기 (0) | 2020.11.08 |
| PyQt 또는 PySide-사용할 항목 (0) | 2020.11.08 |