我正在使用一个将对象应用于字符串列表的函数。但是,这需要很多时间才能完成,因为在检查了对象的库网站后,作者说您需要按块应用它,以免造成内存过载。我正在应用如下功能:
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流程?
答案 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)
它将大大加快您的处理速度。