Il s'agit d'un mémo écrit du livre efficace python d'O'Reilly Japan. https://www.oreilly.co.jp/books/9784873117560/ P35~37
** La liste est la plus simple si vous souhaitez renvoyer les résultats dans une séquence **
Prenons le cas de la vérification de la position des caractères vides dans une phrase
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index + 1)
return result
address = 'Four score and secer years ago...'
result = index_words(address)
print(result[:3])
>>>
[0, 5, 11]
L'opération elle-même est normale, mais il y a deux problèmes
Il y a un point qu'il est difficile de lire dans son ensemble en l'ajoutant plusieurs fois avec append dans la définition de la fonction. Il est pratique d'utiliser un générateur dans de tels cas
def index_words_iter(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter == " ":
yield index + 1
result = list(index_words_iter(address))
print(result[:3])
>>>
[0, 5, 11]
En utilisant yield, il renvoie un itérateur à chaque fois. Vous pouvez également générer facilement une liste en passant un itérateur à list ().
La création d'une liste de résultats dans la fonction index_words signifie que la mémoire sera consommée en conséquence. Pour le traitement de données volumineuses, il existe un risque de crash.
À cet égard, le générateur délivre un élément de données à chaque fois, de sorte qu'il peut gérer n'importe quelle longueur. ** Minimiser la consommation de mémoire ** Un générateur qui lit les données d'un fichier et les traite une par une
def index_file(handle):
offset = 0
for line in handle:
if line:
yield offset
for letter in line:
offset += 1
if letter ==" ":
yield offset
from itertools import islice
with open("address.txt", "r") as f:
it = index_file(f)
results = islice(it, 0, 3)
print(list(results))
>>>
[0, 5, 11]
Vous pouvez désormais gérer des phrases de n'importe quelle longueur et vous n'avez pas à vous soucier des plantages de mémoire. Cependant, il est important de savoir qu'en raison de la nature des itérateurs et des générateurs, le contenu change à chaque fois qu'ils sont appelés (avec état).
Recommended Posts