计算函数的输出 python
count output of a function python
我正在使用以下代码来测试素数。
def primes(n):
""" Returns a list of primes < n """
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
yield [2] + [i for i in xrange(3,n,2) if sieve[i]]
outfile = open('primes','w')
input = input("Feed Me:")
outfile.write(str(primes(input)))
print "Done"
有没有一种简单的方法来计算生成的素数。而不是打印实际数字?
也可以使此代码生成大于 100000000 的素数而不会溢出吗?
您可以删除 table 中的每个偶数,只需将整数除以 2
即可仅存储奇数。 sum
使用布尔值将它们映射到整数:True
是 1,False
是 0;请注意,对于 n >= 2,即使 table 中没有 2
也可以工作,因为 1
在 table 中被标记为素数 ;)
def n_primes(n):
""" Returns the number of primes < n """
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5) + 1,2):
if sieve[i//2]:
sieve[i*i//2::i]=[False]*((n-i*i-1)/(2*i)+1)
return sum(sieve)
甚至更好,计算遇到的素数:
def n_primes(n):
""" Returns the number of primes < n (for n > 2)"""
n_p = 1 # 2 is a prime
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5) + 1,2):
if sieve[i//2]:
n_p += 1
sieve[i*i//2::i]=[False]*((n-i*i-1)/(2*i)+1)
return n_p
请注意,您的 sieve
函数不是 return 列表而是一个产生结果的生成器,您可能想将原始代码编写为
def primes(n):
""" Returns a list of primes < n """
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
return [2] + [i for i in xrange(3,n,2) if sieve[i]]
或使用我的生成器版本:
def primes(n):
""" Yields a sequence of primes < n """
if n <= 2:
return
yield 2
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5) + 1,2):
if sieve[i//2]:
yield i
sieve[i*i//2::i] = [False] * ((n-i*i-1)/(2*i)+1)
在第一种情况下,您可以执行 len(primes(n))
来获取号码(尽管这很浪费),对于第二种情况,您可以执行 sum(1 for i in primes(n))
至于生成高于 100000000
的质数,sieve
table 将在 32 位处理器上花费 (4 * n / 2)
个字节,在 64 位处理器上花费 8 * n / 2
个字节位处理器,所以你的里程可能会有所不同......人们会想要使用某种 bitarray
尽管其中一种不是内置的 python.
我正在使用以下代码来测试素数。
def primes(n):
""" Returns a list of primes < n """
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
yield [2] + [i for i in xrange(3,n,2) if sieve[i]]
outfile = open('primes','w')
input = input("Feed Me:")
outfile.write(str(primes(input)))
print "Done"
有没有一种简单的方法来计算生成的素数。而不是打印实际数字? 也可以使此代码生成大于 100000000 的素数而不会溢出吗?
您可以删除 table 中的每个偶数,只需将整数除以 2
即可仅存储奇数。 sum
使用布尔值将它们映射到整数:True
是 1,False
是 0;请注意,对于 n >= 2,即使 table 中没有 2
也可以工作,因为 1
在 table 中被标记为素数 ;)
def n_primes(n):
""" Returns the number of primes < n """
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5) + 1,2):
if sieve[i//2]:
sieve[i*i//2::i]=[False]*((n-i*i-1)/(2*i)+1)
return sum(sieve)
甚至更好,计算遇到的素数:
def n_primes(n):
""" Returns the number of primes < n (for n > 2)"""
n_p = 1 # 2 is a prime
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5) + 1,2):
if sieve[i//2]:
n_p += 1
sieve[i*i//2::i]=[False]*((n-i*i-1)/(2*i)+1)
return n_p
请注意,您的 sieve
函数不是 return 列表而是一个产生结果的生成器,您可能想将原始代码编写为
def primes(n):
""" Returns a list of primes < n """
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
return [2] + [i for i in xrange(3,n,2) if sieve[i]]
或使用我的生成器版本:
def primes(n):
""" Yields a sequence of primes < n """
if n <= 2:
return
yield 2
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5) + 1,2):
if sieve[i//2]:
yield i
sieve[i*i//2::i] = [False] * ((n-i*i-1)/(2*i)+1)
在第一种情况下,您可以执行 len(primes(n))
来获取号码(尽管这很浪费),对于第二种情况,您可以执行 sum(1 for i in primes(n))
至于生成高于 100000000
的质数,sieve
table 将在 32 位处理器上花费 (4 * n / 2)
个字节,在 64 位处理器上花费 8 * n / 2
个字节位处理器,所以你的里程可能会有所不同......人们会想要使用某种 bitarray
尽管其中一种不是内置的 python.