在Python中创建词典列表的最有效方法

时间:2018-11-11 00:02:46

标签: python list dictionary

假设我有一个对象列表,并且我想为每个对象创建一个字典,并将生成的所有字典放在一个列表中。

我正在做的是以下事情:

Reflect_Value(TestStringName, StringValue)

我想知道是否有比我提议的字典更有效(更快)的方法来创建字典列表。

谢谢。

2 个答案:

答案 0 :(得分:2)

由于您正在处理HTTP请求(这在您的问题中并不明显),其余答案无关紧要:通信将以绝对优势支配计算。无论如何,在这里回答。


原始方法似乎是最慢的:

In [20]: %%timeit 
    ...: list_of_dict = [] 
    ...: for x in xlist: 
    ...:   list_of_dict.append(f(x)) 
    ...:                                                                        
13.5 µs ± 39.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

映射是最好的选择:

In [21]: %timeit list(map(f,xlist))                                             
8.45 µs ± 17 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

列表理解位于中间位置:

In [22]: %timeit [f(x) for x in xlist]                                          
10.2 µs ± 22.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

答案 1 :(得分:-1)

由于您在注释中提到要整体上更快地执行,也许不同步请求?

查看以下博客文章改编的示例:http://skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio/

import asyncio
import requests

async def main():
    xlist = [...]
    list_of_dict = []
    loop = asyncio.get_event_loop()
    futures = [
        loop.run_in_executor(
            None, 
            requests.get, 
            i
        )
        for i in xlist
    ]
    for response in await asyncio.gather(*futures):
        respons_dict = your_parser(response) # Your parsing to dict from before
        list_of_dict.append(response_dict)
    return list_of_dict

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

我认为这可以帮助您实现并行性。只是请注意,您应该确保不会向其他人提出他们不满意的要求。