Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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
Python3列表理解优化_Python_Python 3.x - Fatal编程技术网

Python3列表理解优化

Python3列表理解优化,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)

我正在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)

完全按照你要求的形式

[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倍。而且代码更少。