Python 我是否过度使用这个生成器函数的变量?
我有这两个共同工作的功能。第一个生成下一个素数。第二种方法将素数附加到素数列表中。当我基本上说I=next(n)=nexttime(primeList)时,我觉得我在第二个函数中过度使用了变量。有没有更好的方法写这个Python 我是否过度使用这个生成器函数的变量?,python,variables,loops,generator,Python,Variables,Loops,Generator,我有这两个共同工作的功能。第一个生成下一个素数。第二种方法将素数附加到素数列表中。当我基本上说I=next(n)=nexttime(primeList)时,我觉得我在第二个函数中过度使用了变量。有没有更好的方法写这个 def nextPrime(primeList): checkNum = 3 while True: for i in primeList: if checkNum % i == 0: brea
def nextPrime(primeList):
checkNum = 3
while True:
for i in primeList:
if checkNum % i == 0:
break
if i > math.sqrt(checkNum):
yield checkNum
break
checkNum += 2
def primeNumbers(limit):
primeList = [2]
i = 0
n = nextPrime(primeList)
while i <= limit:
i = next(n)
primeList.append(i)
return primeList
primeList = primeNumbers(200000)
def nexttime(primeList):
checkNum=3
尽管如此:
对于primeList中的i:
如果checkNum%i==0:
打破
如果i>math.sqrt(checkNum):
产量检查数
打破
checkNum+=2
def素数(限制):
primeList=[2]
i=0
n=nexttime(primeList)
而我这行得通吗
def primeNumbers(limit):
primeList = [2]
for i in nextPrime(primeList):
if i > limit:
break
primeList.append(i)
return primeList
您可以使用来为自己完成大部分工作:
import itertools
def primeNumbers(limit):
primes = nextPrime((2,))
# Limit to `limit`.
primes = itertools.takewhile(lambda i: i <= limit, primes)
# Return a list.
return list(primes)
导入itertools
def素数(限制):
primes=nexttime((2,))
#限制到“限制”。
primes=itertools.takewhile(lambda i:i这不需要使用两个函数来实现,但下面是生成“n”以下的primes的一般(我相信是最快的)方法,使用:
输出:
>>>
Without Evens: 1.22693896972
With Evens: 3.01304618635
我认为如果primes_dict range只计算以3开头的奇数,并且在返回之前,primes_dict[2]的速度会快一倍=True。num也必须以同样的方式反应,从3开始,递增2,但是的,这比我的两个函数快得多。谢谢。@JackJ这是一个非常好的观点,我重写了我的代码,大约快2.5倍(10000次调用)并执行prevPrimes(1000)
——这是使用timeit.timeit
函数。更好的是,您可以开始num=i而不是3。例如:当您到达i=11时,33现在为假,55为假,77为假,99为假,但还不是121、143等。此外,我认为在列表中设置值比在dict中设置值更有效。
def primes(n):
"""Generates a list of primes up to 'n'"""
primes_dict = {i : True for i in range(3, n + 1, 2)} # this does not
for i in primes_dict:
if primes_dict[i]:
num = 3
while (num * i <= n):
primes_dict[num*i] = False
num += 2
primes_dict[2] = True
return [num for num in primes_dict if primes_dict[num]]
from timeit import timeit
def test1():
return primes(1000)
print 'Without Evens: ', timeit(test1, number=1000)
print 'With Evens: ', timeit(stmt='prevPrimes(1000)', setup='from nums import prevPrimes', number=1000)
>>>
Without Evens: 1.22693896972
With Evens: 3.01304618635