如何批量应用地图操作?

时间:2019-07-19 15:13:18

标签: python python-3.x data-structures iteration list-comprehension

我正在使用一个将对象应用于字符串列表的函数。但是,这需要很多时间才能完成,因为在检查了对象的库网站后,作者说您需要按块应用它,以免造成内存过载。我正在应用如下功能:

list_1 =['hi how are you', 'i am good', ..., 'how is']
results = list(
    map(lambda string_list_elem: foo(string_list_elem, library_obj), list_1))

以上内容花费了太多时间。加快功能应用程序的最佳方法是什么?到目前为止,我试图将列表分成如下这样的块:

import itertools

def split_seq(iterable, size):
    it = iter(iterable)
    item = list(itertools.islice(it, size))
    while item:
        yield item
        item = list(itertools.islice(it, size))

list(split_seq(list_1, 500))

但是,我不知道这是否行得通。我应该执行列表理解还是仅使用此功能并拆分?建议使用什么方法来加速results_list流程?

1 个答案:

答案 0 :(得分:1)

由于您无法显示/共享关键功能/工作人员foo(),因此我无法识别所有可能通过不同的优化技术解决的潜在瓶颈。
在这一阶段,我建议从concurrent.futures.ThreadPoolExecutor开始并发/异步方法:

from concurrent.futures import ThreadPoolExecutor
import functools

def foo(string_list_elem, library_obj):
    ....

str_list = ['hi how are you', 'i am good', ..., 'how is']

with ThreadPoolExecutor() as executor:
    # replace `<your_lib>` with your actual library_obj
    results = list(executor.map(functools.partial(foo, library_obj=<your_lib>), str_list))
    print(results)

它将大大加快您的处理速度。