首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我需要经常回到起点时,使用生成器或列表更好吗?

当我需要经常回到起点时,使用生成器或列表更好吗?
EN

Stack Overflow用户
提问于 2018-04-15 12:51:36
回答 2查看 66关注 0票数 0

我想对一大串数字的除数进行求和,为此,我使用了一个素数生成器:

代码语言:javascript
复制
def sieve_of_eratosthenes(limit):
    # Initialize the primality list
    a = [False] * 2 + [True] * (limit-2)

    for (i, isprime) in enumerate(a):
        if isprime:
            yield i
            # Mark factors non-prime
            for n in range(i*i, limit, i):     
                a[n] = False

因为我想做的是:

代码语言:javascript
复制
for n in numbers_list:
    s = 0
    for p in sieve_of_eratosthenes(limit):
        if not x % p:
            s += p 

我想知道,最好只创建一个生成器一次,然后将它转化为一个列表,从而生成一个我只创建一次的大型对象,还是在每次迭代中继续创建生成器(因为我每次都需要从头开始)。

是否应该像这样使用生成器,或者列出正确的解决方案,或者这只是内存/运行时的简单权衡?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-15 14:44:18

有两种选择:保持低内存或低运行时.

低内存:,因为您不会修改生成器中的任何元素或通过索引访问元素,所以最好使用生成器,因为它们只返回内存.But中的一个对象--您必须在循环中的每个I中运行生成器函数。

低运行时:使用列表生成的只在for循环之前生成一次。

代码语言:javascript
复制
def sieve_of_eratosthenes(limit):
    # Initialize the primality list
    a = [False] * 2 + [True] * (limit-2)

    for (i, isprime) in enumerate(a):
        if isprime:
            yield i
            # Mark factors non-prime
            for n in range(i*i, limit, i):     
                a[n] = False

limits = list(sieve_of_eratosthenes(limit))
for n in numbers_list:
    s = 0
    for p in limits:
        if not x % p:
            s += p 
票数 0
EN

Stack Overflow用户

发布于 2018-04-15 13:05:43

对于这种情况,我认为列表会更好,但是您可以使用python模块来测试自己:

代码语言:javascript
复制
from timeit import timeit

limit = value

def f1():
    #code using list

def f2():
    #code using generator

print( 'List', timeit('f1(limit)', setup=' from __main__ import f1, f2,limit') )
print( 'Generator', timeit('f2(limit)', setup=' from __main__ import f1, f2,limit') )

它会打印运行代码所需的时间大约10**6次.如果这太长,只需在timeit函数中添加一个额外的参数,称为number。例如100次跑步

代码语言:javascript
复制
print( 'List', timeit('f1(limit)', setup=' from __main__ import f1, f2,limit', number=100) )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49842115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档