한 가지 방법은 다양한 방법을 테스트 timeit module을 사용하는 것입니다. 예를 들어, 다음 코드 채찍질 :
import array
import bisect
import random
import timeit
mylist = list(random.randint(1, 50000) for i in xrange(1000))
myset = set(mylist)
myarray = array.array('l', mylist)
s = "1919 in mylist"
t = timeit.Timer(s, "from __main__ import mylist")
print s + ":%.2f usec/pass" % (1000000 * t.timeit(number = 100000)/100000)
s = "1919 in myset"
t = timeit.Timer(s, "from __main__ import myset")
print s + ":%.2f usec/pass" % (1000000 * t.timeit(number = 100000)/100000)
s = "1919 in myarray"
t = timeit.Timer(s, "from __main__ import myarray")
print s + ":%.2f usec/pass" % (1000000 * t.timeit(number = 100000)/100000)
mysortedlist = sorted(mylist)
mysortedarray = array.array('l', mysortedlist)
s = "1919 in mysortedlist"
t = timeit.Timer(s, "from __main__ import mysortedlist")
print s + ":%.2f usec/pass" % (1000000 * t.timeit(number = 100000)/100000)
s = "1919 in mysortedarray"
t = timeit.Timer(s, "from __main__ import mysortedarray")
print s + ":%.2f usec/pass" % (1000000 * t.timeit(number = 100000)/100000)
def bisect_in(a, x):
i = bisect.bisect_left(a, x)
return (i != len(a) and a[i] == x)
s = "bisect_in(mysortedlist, 1919)"
t = timeit.Timer(s, "from __main__ import bisect_in, mysortedlist")
print s + ":%.2f usec/pass" % (1000000 * t.timeit(number = 100000)/100000)
을 나는 다음과 같은 결과를 얻었다 :이 테스트가 가정에서 세트를 사용하는 것이 가장 빠른 것으로 다른 사람의 주장을 (지원
1919 in mylist:73.89 usec/pass
1919 in myset:0.29 usec/pass
1919 in myarray:103.77 usec/pass
1919 in mysortedlist:75.12 usec/pass
1919 in mysortedarray:114.21 usec/pass
bisect_in(mysortedlist, 1919):4.17 usec/pass
코드가 만든다).
세트/세트 번호의 크기가 고정되어 있습니까? – helpermethod
아니요, 다를 수 있습니다. 고정 번호 목록에 대한 통찰력도 환영합니다. – Peter
집합으로 변환하는 것은 비교적 비용이 많이 드는 작업이지만 'i in mylist'도 비용이 많이 듭니다. 같은 목록에서 몇 번 이상이 작업을한다면, 집합을 사용하는 것이 더 낫다. –