如何更快地完成此功能? (我称之为很多时间,这可能会提高速度)
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
答案 0 :(得分:7)
您可以尝试查看itertools.product
等效于生成器表达式中的嵌套for循环。例如, 对于B中的y,product(A,B)返回与(x,y)中的x相同的返回值。
嵌套循环像具有最右边元素的里程表一样循环 在每次迭代中前进。这种模式创造了一个词典 排序,以便输入的iterables排序,产品 元组按排序顺序发出。
调用范围(0,I)等时也不需要0 - 只使用范围(I)
所以在你的情况下它可以是:
import itertools
def vectorr(I, J, K):
return itertools.product(range(K), range(J), range(I))
答案 1 :(得分:2)
你说你希望它更快。让我们用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语言实现,所以非常非常快 - 如果输入值有些大,这可能很重要。
答案 2 :(得分:1)
其他答案更彻底,至少在这种情况下更好,但一般来说,如果您使用的是Python 2,并且对于I,J或K的大值,请使用xrange()
而不是range()
。 xrange
提供类似生成器的对象,而不是构造列表,因此您不必为整个列表分配内存。
在Python 3中,range
的工作方式与Python 2的xrange
类似。
答案 3 :(得分:1)
import numpy
def vectorr(I,J,K):
val = numpy.indices( (I,J,K))
val.shape = (3,-1)
return val.transpose() # or val.transpose().tolist()