Python 我是否过度使用这个生成器函数的变量?

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

我有这两个共同工作的功能。第一个生成下一个素数。第二种方法将素数附加到素数列表中。当我基本上说I=next(n)=nexttime(primeList)时,我觉得我在第二个函数中过度使用了变量。有没有更好的方法写这个

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