Python 比减法设置更节省内存的对象
Python more memory efficient object than set for subtraction
我正在尝试编写一个函数,该函数可以使用 Sieve of Eratosthenes 找到某个非常大的数以下的所有质数。我写了函数:
def primes(limit):
#efficient method for finding large primes
l=set()
i=1
while i<limit+1:
l.add(i)
i+=2
s=int(math.sqrt(limit))
#recur until sqrt is small
if s<=1000:
ps=smallprimes(s)
else:
ps=primes(s)
for p in ps:
l-=set(multiples(p,limit+1)[1:])
return [2]+(list(l)[1:])
其中 smallprimes 仅通过检查因子的数量来计算低于限制的素数,而 multiples 计算低于限制的数字的所有倍数。
将非常大的限制传递给 primes
,我将大集合创建为 limits
平方根以下所有素数的 "strike out" 倍数。
有没有比使用集合更有效地 "strike out" 从序列中提取数字的方法?我想知道因为我真的只需要减去两个数组,我不需要防止重复等
对于大型数据集,使用集合会有问题,因为散列冲突的数量会显着增加,除此之外还会产生不必要的存储开销。
另一种解决方案是使用 numpy
掩码数组。数组中的索引是数字,值表示它是否为素数。您可以通过将数字设置为 2 * index + 1
来进一步优化,以便您只存储奇数。
这只是一个例子。大筛子用套子效率会很低
我正在尝试编写一个函数,该函数可以使用 Sieve of Eratosthenes 找到某个非常大的数以下的所有质数。我写了函数:
def primes(limit):
#efficient method for finding large primes
l=set()
i=1
while i<limit+1:
l.add(i)
i+=2
s=int(math.sqrt(limit))
#recur until sqrt is small
if s<=1000:
ps=smallprimes(s)
else:
ps=primes(s)
for p in ps:
l-=set(multiples(p,limit+1)[1:])
return [2]+(list(l)[1:])
其中 smallprimes 仅通过检查因子的数量来计算低于限制的素数,而 multiples 计算低于限制的数字的所有倍数。
将非常大的限制传递给 primes
,我将大集合创建为 limits
平方根以下所有素数的 "strike out" 倍数。
有没有比使用集合更有效地 "strike out" 从序列中提取数字的方法?我想知道因为我真的只需要减去两个数组,我不需要防止重复等
对于大型数据集,使用集合会有问题,因为散列冲突的数量会显着增加,除此之外还会产生不必要的存储开销。
另一种解决方案是使用 numpy
掩码数组。数组中的索引是数字,值表示它是否为素数。您可以通过将数字设置为 2 * index + 1
来进一步优化,以便您只存储奇数。
这只是一个例子。大筛子用套子效率会很低