У своїй роботі я часто використовую цикл for для ітерації по даних. Іноді список може бути малим, а іноді дуже великим. У моєму керованому середовищі Spark, яке має обмежену пам'ять драйвера, я зіткнувся з помилкою через недостатню пам'ять. Я виявив, що використання функції-генератора допомогло вирішити цю проблему.
Функція-генератор з ключовим словом yield
генерує значення по одному, замість того, щоб зберігати їх усі в пам'яті.
# Функція-генератор
def generator_function(n):
for i in range(n):
print("generator_function генерує ", i)
yield i
# Звичайна функція
def regular_function(n):
print("regular_function повертає")
return [i for i in range(n)]
for item in generator_function(10):
print(item)
temp_list = regular_function(10)
print(temp_list)
generator_function генерує 0
0
generator_function генерує 1
1
generator_function генерує 2
2
generator_function генерує 3
3
generator_function генерує 4
4
generator_function генерує 5
5
generator_function генерує 6
6
generator_function генерує 7
7
generator_function генерує 8
8
generator_function генерує 9
9
regular_function повертає
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Як ви можете побачити з повідомлень, функція-генератор генерує одне значення за раз, тоді як звичайна функція повертає весь список одразу.
Перекладено з: Generator Function (yield keyword) in Python