Python 3.x 如何在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之后,它似乎和生成器之前一样慢。我怀疑这是因为我现在重复了两次列表aPython 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非常大,因此我需要它尽可能高效;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。