最近、素数ふるいを高速化するために、ここから bitarray モジュールをダウンロードしましたが、結果は悲惨です。
from bitarray import bitarray
from numpy import ones
from timeit import timeit
def sieve1(n = 1000000):
'''Sieve of Eratosthenes (bitarray)'''
l = (n - 1)/2; a = bitarray(l); a.setall(True)
for i in xrange(500):
if a[i]:
s = i+i+3; t = (s*s-3)/2; a[t:l:s] = False
return [2] + [x+x+3 for x in xrange(l) if a[x]]
def sieve2(n = 1000000):
'''Sieve of Eratosthenes (list)'''
l = (n - 1)/2; a = [True] * l
for i in xrange(500):
if a[i]:
s = i+i+3; t = (s*s-3)/2; u = l-t-1
a[t:l:s] = [False] * (u/s + 1)
return [2] + [x+x+3 for x in xrange(l)]
def sieve3(n = 1000000):
'''Sieve of Eratosthenes (numpy.ones)'''
l = (n - 1)/2; a = ones(l, dtype=bool)
for i in xrange(500):
if a[i]:
s = i+i+3; t = (s*s-3)/2; a[t:l:s] = False
return [2] + [x+x+3 for x in xrange(l)]
print timeit(sieve1, number=10)
print timeit(sieve2, number=10)
print timeit(sieve3, number=10)
ここに結果があります -
1.59695601594
0.666230770593
0.523708537583
ふるいは、リストのbitarray
2 倍以上遅いです。より良い配列の提案はありますか? 何でも python よりも高速である必要があるlist
か、そう思いました。
最速ですが、時間がかかるのでnumpy.ones
嫌いです。numpy
import
True
私は基本的に、変更可能で、およびを保持できる高速なデータホルダーを探していFalse
ます。