[英]alternative (faster) war to 3 nested for loop python
我怎样才能更快地完成这个功能? (我称之为很多时间,可能会提高速度)
def vectorr(I, J, K):
vect = []
for k in range(0, K):
for j in range(0, J):
for i in range(0, I):
vect.append([i, j, k])
return vect
您可以尝试查看itertools.product
等效于生成器表达式中的嵌套for循环。 例如,乘积(A,B)与A中的x的((x,y)相同,对于B中的y,返回相同的值)。
嵌套循环像里程表一样循环,最右边的元素在每次迭代时前进。 此模式创建了一个词典排序,以便在输入的可迭代内容进行排序时,产品元组按排序顺序发出。
调用范围(0,I)等时也不需要0 - 只使用范围(I)
所以在你的情况下它可以是:
import itertools
def vectorr(I, J, K):
return itertools.product(range(K), range(J), range(I))
你说你希望它更快。 让我们用NumPy吧!
import numpy as np
def vectorr(I, J, K):
arr = np.empty((I*J*K, 3), int)
arr[:,0] = np.tile(np.arange(I), J*K)
arr[:,1] = np.tile(np.repeat(np.arange(J), I), K)
arr[:,2] = np.repeat(np.arange(K), I*J)
return arr
这里可能有更优雅的调整,但这是一个基本的平铺,给出相同的结果(但作为2D数组而不是列表列表)。 这个代码全部用C语言实现,所以非常非常快 - 如果输入值有些大,这可能很重要。
其他答案更彻底,在这个特定情况下至少更好,但一般来说,如果你使用Python 2,并且对于I,J或K的大值,使用xrange()
而不是range()
。 xrange
提供类似于生成器的对象,而不是构造列表,因此您不必为整个列表分配内存。
在Python 3中, range
就像Python 2的xrange
。
import numpy
def vectorr(I,J,K):
val = numpy.indices( (I,J,K))
val.shape = (3,-1)
return val.transpose() # or val.transpose().tolist()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.