Python3列表理解优化
我正在Python3中对列表进行理解,根据给定的范围对列表序列号列表进行理解。我的代码可以很好地工作,但问题是范围大,速度慢,需要很多时间。我想有别的办法吗?我不想用numpyPython3列表理解优化,python,python-3.x,Python,Python 3.x,我正在Python3中对列表进行理解,根据给定的范围对列表序列号列表进行理解。我的代码可以很好地工作,但问题是范围大,速度慢,需要很多时间。我想有别的办法吗?我不想用numpy global xy xy = 0 a = 3 def func(x): global xy xy += 1 return xy my_list = [[func(x) for x in range(a)] for x in range(a)] xy = 0 print(my_list)
global xy
xy = 0
a = 3
def func(x):
global xy
xy += 1
return xy
my_list = [[func(x) for x in range(a)] for x in range(a)]
xy = 0
print(my_list)
完全按照你要求的形式
[list(range(x, x + a)) for x in range(1, a**2 + 1, a)]
优化
如果您只迭代内部列表元素
(range(x, x + a) for x in range(1, a**2 + 1, a))
如果只为内部元素编制索引(用于索引内部
和外部
)
如果你两者都做的话
[range(x, x + a) for x in range(1, a**2 + 1, a)]
注意:我想你可以通过将它们与mousetail的答案以你要求的形式结合起来,从中获得更多的性能
[list(range(x, x + a)) for x in range(1, a**2 + 1, a)]
优化
如果您只迭代内部列表元素
(range(x, x + a) for x in range(1, a**2 + 1, a))
如果只为内部元素编制索引(用于索引内部
和外部
)
如果你两者都做的话
[range(x, x + a) for x in range(1, a**2 + 1, a)]
注意:我认为,通过将它们与mousetail的答案结合起来,您可以从中获得更高的性能试试:
t = [list(range(a*i + 1, a*(i+1) + 1)) for i in range(a)]
即使对于>100,它似乎也相当快,但对于图形循环或事件处理程序内部来说,速度还不够快请尝试:
t = [list(range(a*i + 1, a*(i+1) + 1)) for i in range(a)]
即使对于>100,它似乎也相当快,但对于图形循环或事件处理程序内部来说,速度还不够快。有多种方法可以完成您所做的事情。一旦我们做了性能检查,你会有一个更清晰的画面
import timeit
# Process 1
setup = '''
global xy
xy =0
a=30
def func(x):
global xy
xy+=1
return xy
'''
code = '''
my_list = []
for x in range(a):
my_list1 = []
for x in range(a):
my_list1.append(func(x))
my_list.append(my_list1)
'''
print(min(timeit.Timer(code, setup=setup).repeat(7, 1000)))
# Process 2
setup_2 = """
global xy
xy =0
a=30
def func(x):
global xy
xy+=1
return xy
"""
print(min(timeit.Timer('[[func(x)for x in range(a)] for x in range(a)]', setup=setup_2).repeat(7, 1000)))
# Process 3
setup_3 = 'a=30'
print(min(timeit.Timer('[[(x*a)+b for b in range(a)] for x in range(a)]', setup=setup_3).repeat(7, 1000)))
# process 4
setup_4 = 'a=30'
print(min(timeit.Timer('[list(range(a*i + 1, a*(i+1) + 1)) for i in range(a)]', setup=setup_4).repeat(7, 1000)))
输出
0.21270840199999996
0.1699727179999999
0.08638116599999979
0.028964930000000333
您可以看到,最后一个进程是最快的,因为所有操作都是在局部变量而不是全局变量中进行的。速度几乎快了10倍
[list(range(a*i + 1, a*(i+1) + 1)) for i in range(a)]
如果可能,请使用局部变量:
Python检索本地文件的速度更快
变量,而不是检索全局变量。也就是说,避免
“全局”关键字
有多种方法可以完成你所做的事情。一旦我们做了性能检查,你会有一个更清晰的画面
import timeit
# Process 1
setup = '''
global xy
xy =0
a=30
def func(x):
global xy
xy+=1
return xy
'''
code = '''
my_list = []
for x in range(a):
my_list1 = []
for x in range(a):
my_list1.append(func(x))
my_list.append(my_list1)
'''
print(min(timeit.Timer(code, setup=setup).repeat(7, 1000)))
# Process 2
setup_2 = """
global xy
xy =0
a=30
def func(x):
global xy
xy+=1
return xy
"""
print(min(timeit.Timer('[[func(x)for x in range(a)] for x in range(a)]', setup=setup_2).repeat(7, 1000)))
# Process 3
setup_3 = 'a=30'
print(min(timeit.Timer('[[(x*a)+b for b in range(a)] for x in range(a)]', setup=setup_3).repeat(7, 1000)))
# process 4
setup_4 = 'a=30'
print(min(timeit.Timer('[list(range(a*i + 1, a*(i+1) + 1)) for i in range(a)]', setup=setup_4).repeat(7, 1000)))
输出
0.21270840199999996
0.1699727179999999
0.08638116599999979
0.028964930000000333
您可以看到,最后一个进程是最快的,因为所有操作都是在局部变量而不是全局变量中进行的。速度几乎快了10倍
[list(range(a*i + 1, a*(i+1) + 1)) for i in range(a)]
如果可能,请使用局部变量:
Python检索本地文件的速度更快
变量,而不是检索全局变量。也就是说,避免
“全局”关键字
为什么在第一行使用
全局xy
?它只在任何函数或类中有用。这段代码非常奇怪func
除了递增并返回一个全局计数器之外什么都不做,您可以使用range
来代替。你到底想达到什么目的?这对我来说似乎是个XY问题。此外,您似乎没有完全理解全局
关键字的作用,这可能会进一步混淆。范围(a)中x的将产生0..3,而您最希望的列表可能是:[[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3]
,因为范围(a)中x有
在另一个之上。我认为他想要建立一个足够大的列表。这样告诉我们的问题是,范围大,速度慢,需要花费很多时间
您已经在全局名称空间中声明xy,使用全局
是多余的。您可以使用生成器一次打印每个列表,这样可以节省内存,但我不确定这是否会加快进程。为了加快速度,您需要生成多个进程并并行构建列表(假设您有多核处理器可用)。为什么要在第一行使用global xy
?它只在任何函数或类中有用。这段代码非常奇怪func
除了递增并返回一个全局计数器之外什么都不做,您可以使用range
来代替。你到底想达到什么目的?这对我来说似乎是个XY问题。此外,您似乎没有完全理解全局
关键字的作用,这可能会进一步混淆。范围(a)中x的将产生0..3,而您最希望的列表可能是:[[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3]
,因为范围(a)中x有
在另一个之上。我认为他想要建立一个足够大的列表。这样告诉我们的问题是,范围大,速度慢,需要花费很多时间
您已经在全局名称空间中声明xy,使用全局
是多余的。您可以使用生成器一次打印每个列表,这样可以节省内存,但我不确定这是否会加快进程。为了加快速度,您需要生成多个进程并并行构建列表(假设您有多核处理器可用)。很好,大约比原来快5-10倍。代码更少。不错,大约比原来快5-10倍。而且代码更少。