Pergunta

Muitos métodos que usavam para retornar listas em Python 2.x agora parecem retornar iterators em Py3k

Tem iterators também gerador de expressões? avaliação preguiçosa?

Assim, com isso, o consumo de memória de python vai reduzir drasticamente. não é?

E para os programas convertidos de 2to3 usando o script embutido?

A ferramenta embutida explicitamente converter todos os iteradores retornados em listas, para compatibilidade? Se sim, então a memória menor benefício pegada de Py3k não é realmente aparente nos programas convertidos. É?

Foi útil?

Solução

Muitos deles não são exatamente iteradores, mas ver objetos especiais. Para gama instância () agora retorna algo semelhante ao objeto xrange de idade - ele ainda pode ser indexado, mas preguiçosamente constrói os inteiros conforme necessário

.

Da mesma forma dict.keys () dá um dict_keys objeto implementando uma vista sobre o dict, em vez de criar uma nova lista com uma cópia das chaves.

Como isso afeta memória pegadas provavelmente depende do programa. Certamente há mais de uma ênfase no sentido de utilizar iterators a menos que você realmente precisa listas, enquanto o uso de listas era geralmente o caso padrão no python2. Isso fará com que o programa de média para provavelmente mais eficiente de memória. Casos em que há realmente uma grande economia provavelmente vai já ser implementado como iteradores em programas python2 No entanto, como o uso de memória muito grande vai se destacar, e é mais provável que seja já abordados. (Ex. O arquivo iterador já é muito mais memória eficiente que o método file.readlines() mais velho)

A conversão é feita pela ferramenta 2to3, e geralmente converter coisas como range () para iterators onde se pode determinar com segurança uma lista real não é necessário, para que o código como:

for x in range(10): print x

mudará para o novo objeto range (), não criar uma lista, e assim obterá o benefício reduzido de memória, mas um código como:

x = range(20)

será convertido como:

x = list(range(20))

como o conversor não pode saber se o código espera um real lista de objetos em x.

Outras dicas

Tem iterators também gerador de expressões? avaliação preguiçosa?

Um iterador é apenas um objeto com um método seguinte. O que os meios de documentação maior parte do tempo ao dizer que a função retorna um iterador é que o seu resultado é preguiçosamente carregado.

Assim, com isso, o consumo de memória de python vai reduzir drasticamente. não é?

Depende. Eu acho que o programa médio não iria notar um enorme diferença embora. As vantagens de desempenho de iterators mais listas só é realmente importante se você tem um grande conjunto de dados. Você pode querer ver esta questão .

Um dos maiores benefícios da iterators mais de listas não é memória, é realmente tempo de computação. Por exemplo, em Python 2:

for i in range(1000000):  # spend a bunch of time making a big list
    if i == 0:
        break  # Building the list was a waste since we only looped once

Agora pegue por exemplo:

for i in xrange(1000000):  # starts loop almost immediately
    if i == 0:
        break  # we did't waste time even if we break early

Embora o exemplo é planejado, o caso de uso não é: loops são muitas vezes quebrado fora do meio do caminho. Construir uma lista de toda a apenas uma parte uso de que é um desperdício, a menos que você está indo para usá-lo mais de uma vez. Se for esse o caso, você pode construir explicitamente uma lista: r = list(range(100)). É por isso que iteradores são o padrão em mais lugares em Python 3; você não está fora qualquer coisa desde que você ainda pode criar explicitamente listas (ou outros recipientes), quando você precisa. Mas você não é obrigado a quando tudo o que pretende fazer é iterar sobre uma iterable uma vez (que eu diria é o caso mais comum).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top