Created
October 20, 2010 15:38
-
-
Save bobrik/636653 to your computer and use it in GitHub Desktop.
lazy map variant for python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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