Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在python中使用一个生成器创建两个列表_Python 3.x_List_Performance - Fatal编程技术网

Python 3.x 如何在python中使用一个生成器创建两个列表

Python 3.x 如何在python中使用一个生成器创建两个列表,python-3.x,list,performance,Python 3.x,List,Performance,我试图从一个只有一个生成器的基本列表创建两个单独的列表,但不知道如何做 这就是我的想法,我想知道是否有一种方法可以在下面创建列表的b和c,同时只循环a一次 a=[[1,2,3,4],[5,6,7,8],[9,10,11,12]] b=[x[:2]表示a中的x] c=[x[2:]表示a中的x] 我之前做的只是通过a使用for循环,每次迭代都不断地将x[:2],x[2:]附加到b,c,但在使用timeit模块后,我发现使用生成器实际上更快,所以我继续使用两个独立的生成器,但是在上面的python代码

我试图从一个只有一个生成器的基本列表创建两个单独的列表,但不知道如何做

这就是我的想法,我想知道是否有一种方法可以在下面创建列表的b和c,同时只循环a一次

a=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]

b=[x[:2]表示a中的x]

c=[x[2:]表示a中的x]

我之前做的只是通过a使用for循环,每次迭代都不断地将x[:2],x[2:]附加到b,c,但在使用timeit模块后,我发现使用生成器实际上更快,所以我继续使用两个独立的生成器,但是在上面的python代码中使用timeit之后,它似乎和生成器之前一样慢。我怀疑这是因为我现在重复了两次列表a


基本上,我的问题是,在给定二维列表的情况下,创建b和c的最有效方法是什么?对于我的应用程序,基本列表a非常大,因此我需要它尽可能高效;DR:我建议在做任何优化之前(如果你真的认为你需要的话)继续使用列表理解和基准

我尝试了四种方法:

使用循环:

def use_loop(a):
    b = []
    c = []
    for item in a:
        b.append(item[:2])
        c.append(item[2:])
    return (b,c)
使用列表理解两次:

def use_comprehension(a):
    b = [x[:2] for x in a]
    c = [x[2:] for x in a]
    return (b,c)
在zip中使用列表理解

def use_comprehension_with_zip(a):
    data = [[], []]
    b, c = zip(*[(x[:2], x[2:]) for x in a])
    return (list(b),list(c))
使用线程是多余的,它肯定会增加你的时间

def get_shorter_list(a, index, ans):
    if index == 0:
        for item in a:
            ans.append(item[:2])
    else:
        for item in a:
            ans.append(item[2:])

def use_threads(a):
    b = []
    c = []
    data = {0:b, 1:c}
    threads = []
    for x in range(2):
        thread = threading.Thread(target = get_shorter_list, args=(a, x, data.get(x)))
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

    return (b,c)
然后我用timeit来做这三种方法

function_list = [
                use_loop,
                use_comprehension,
                use_comprehension_with_zip,
                use_threads
                ]

assert use_loop(a) == use_comprehension(a) == use_comprehension_with_zip(a) == use_threads(a)

for function in function_list:
    print(f'Time taken by {function.__name__}: {timeit.timeit("function(a)", globals = globals(), number = 10000)}')
这并没有因为使用列表理解而表现出巨大的退化,为了清晰、简洁和快速,我一直喜欢使用列表理解

Time taken by use_loop: 0.01102178400469711
Time taken by use_comprehension: 0.011585937994823325
Time taken by use_comprehension_with_zip: 0.0187399349961197
Time taken by use_threads: 2.036599840997951

我认为您应该最终使用Numpy(使用Numpy 2D切片)。如果我理解正确,列表a和b包含相同的数据,因此使用生成器创建第一个列表,然后将列表a复制到列表b。