Skip to content

Instantly share code, notes, and snippets.

@bobrik
Created October 20, 2010 15:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bobrik/636653 to your computer and use it in GitHub Desktop.
Save bobrik/636653 to your computer and use it in GitHub Desktop.
lazy map variant for python
#!/usr/bin/python
def lazy_map(func, *sequences):
"""
Ленивая реализация map, делающая вызовы только при необходимости
получения результата, т.е. итерации возвращаемого генератора.
При множественном вызове получается чистая композиция функций, т.е.
lazy_map(lambda: x+1, lazy_map(lambda x: x+2, [1, 2, 3]))
последовательно будет вызывать x+2 и x+1, тогда как обычный map
сначала вызовет x+2 для всего массива, вернёт его, а затем вызовет x+1
для всех элементов полученного массива.
В итоге, в памяти одновременно хранится один лишний итератор (или массив!),
вместо того, чтобы хранить только текущий элемент
По идее, позволяет лучше распараллеливать, если отправлять
в пул потоков каждый вызов next() у итератора
"""
for i in xrange(0, min(map(lambda l: len(l), sequences))):
yield func(*map(lambda sequence: sequence[i], sequences))
for i in lazy_map(lambda x, y: x+y, [1,2,3,4,5], [4,5,6]):
print i
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment